JavaRush /Java Blog /Random-TK /Iki sözleýjiniň ertekisi: Java-da bäsdeşlik üýtgetme stra...

Iki sözleýjiniň ertekisi: Java-da bäsdeşlik üýtgetme strategiýasy

Toparda çap edildi
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 .
Iki iteratoryň ertekisi: Java-da bäsdeşlik üýtgetme strategiýasy - 1
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).

Surat

Bu strategiýa bilen, iterator kolleksiýanyň döredilen wagtyndaky ýagdaýy bilen baglanyşykly - bu kolleksiýanyň gysgaça suraty. Asyl ýygyndyda edilen islendik üýtgeşmeler, esasy maglumatlar gurluşynyň täze wersiýasynyň döredilmegine getirýär. Bu, suratymyzy üýtgetmeýär, şonuň üçin iterator döredilenden soň bolup geçen kolleksiýadaky üýtgeşmeleri görkezmeýär. Bu köne göçürmek (COW) usulydyr . Bir wagtyň özünde üýtgetmek meselesini doly çözýär, şonuň üçin bu çemeleşme bilen “ConcurrentModificationException” döredilmeýär. Mundan başga-da, iteratorlar elementleri üýtgedýän amallary goldamaýarlar. Göçürmek-ýazmak kolleksiýalary ulanmak gaty gymmat bolýar, ýöne üýtgeşmeler iterator gezelençlerinden has ýygy-ýygydan ýüze çyksa, olary ulanmagyň manysy bar. Mysal üçin CopyOnWriteArrayList we CopyOnWriteArraySet synplary .

Kesgitlenmedik özüni alyp baryş

Wektor we Hashtable ýaly miras ýygnamak görnüşlerinde kesgitlenmedik hereketlere duş gelip bilersiňiz . Ikisinde-de adaty şowsuz çalt iteratorlary bar, ýöne üstesine-de, sanamak interfeýsini ulanmaga rugsat berýärler we şol bir wagtyň özünde üýtgän ýagdaýynda özüňi nähili alyp barmalydygyny bilenoklar. Käbir elementleriň gaýtalanmagy ýa-da ýitmegi, hatda käbir geň kadadan çykmalar bilen ýüzbe-ýüz bolup bilersiňiz. Olar bilen oýnamazlyk has gowudyr!
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION