Belligiň awtory Krakowdan (Polşa) programma üpjünçisi Grzegorz Mirek. Ol takmynan 6 ýyl ozal uniwersitetde okaýarka Java-da ösüp başlady we şondan bäri bu ugurdaky başarnyklaryny ýadawsyz ýuwýar. Esasanam öz blogunda ýazýan JVM öndürijiligi we optimizasiýasy bilen gyzyklanýar .
Iň meşhur Java söhbetdeşlik soraglarynyň arasynda aşakdakylar bar: Çalt we şowsuz iteratorlaryň arasynda näme tapawut bar? Muňa iň ýönekeý jogap: Şowsuz çalt iterator, kolleksiýa gaýtalanma wagtynda üýtgese, “ConcurrentModificationException” zyňýar, ýöne şowsuz iterator üýtgemeýär. Bu diýseň manyly ýaly görünse-de, söhbetdeşiň ygtybarly däl diýmek nämäni aňladýandygy entek belli däl? Java dil aýratynlyklary bu termini iteratorlara degişlilikde kesgitlemeýär. Şeýle-de bolsa, dört bäsdeşlik üýtgetme strategiýasy bar.
Bäsdeşlik üýtgetmesi
Ilki bilen, bäsdeşlik (ýa-da parallel) üýtgetmegiň nämedigini kesgitläliň. Collectionygyndymyz bar diýeliň we iterator işjeň bolsa, bu iteratordan gelmeýän käbir üýtgeşmeler bolýar. Bu ýagdaýda bäsdeşlikli üýtgeşme alarys. Size ýönekeý bir mysal bereýin: birnäçe sapak bar diýeliň. Birinji sapak gaýtalanýar, ikinji sapak şol bir ýygyndydan elementleri goýýar ýa-da aýyrýar. Şeýle-de bolsa, bir sapakly gurşawda işleýän wagtymyz “ConcurrentModificationException” alyp bileris :List<String> cities = new ArrayList<>();
cities.add(“Warsaw”);
cities.add(“Prague”);
cities.add(“Budapest”);
Iterator<String> cityIterator = cities.iterator();
cityIterator.next();
cities.remove(1);
cityIterator.next(); // генерирует ConcurrentModificationException
Şowsuz
Aboveokardaky kod bölegi şowsuz çalt iteratoryň mysalydyr . Görşüňiz ýaly, iteratoryň ikinji elementini aljak bolanda “ConcurrentModificationException” zyňyldy . Iterator kolleksiýa döredileli bäri üýtgedilendigini nädip bilýär? Mysal üçin, soňkyModified- da kolleksiýanyň senesi / wagt möhüri bolup biler . Iterator döredilende, bu meýdany göçürip, iterator obýektinde saklamaly. Soň bolsa, her gezek indiki () usul çagyrylanda, ýygyndydaky iň soňky üýtgedilen bahany iteratoryň göçürmesi bilen deňeşdirersiňiz . Örän meňzeş çemeleşme, mysal üçin, ArrayList synpyny durmuşa geçirmekde ulanylýar . Onda sanawyň näçe gezek üýtgedilendigini saklaýan üýtgeýän modCount bar:final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
Şowsuz çalt iteratorlaryň iň oňat tohumda işleýändigini bellemek möhümdir , şol bir wagtyň özünde üýtgedilen ýagdaýynda “ConcurrentModificationException” -yň atyljakdygyna kepillik ýok. Şonuň üçin olara bil baglamaly däl, tersine, ýalňyşlyklary ýüze çykarmak üçin ulanylmaly. Gabat gelmeýän kolleksiýalaryň köpüsi çalt iteratorlary üpjün edýär.
Gowşak yzygiderlilik
Java.util.concurrent paketindäki birmeňzeş ýygyndylaryň köpüsi (mysal üçin ConcurrentHashMap we nobatlaryň köpüsi ) gowşak yzygiderli iteratorlary üpjün edýär. Bu adalganyň manysy resminamalarda gaty gowy düşündirilýär :- Olary beýleki amallar bilen bir wagtda gaýtadan işläp bolýar
- Hiç haçan “ConcurrentModificationException” zyňmaýarlar
- Iteratoryň bir gezek döredilen pursatynda bar bolan elementleri kesip geçmek kepillendirilýär we indiki üýtgeşmeleri görkezip bilýär (ýöne talap edilmeýär).
GO TO FULL VERSION