Fail-Safe Iterator vs Fail-Fast Iterator

1. Uvod

U ovom ćemo članku predstaviti koncept brzog i sigurnog otkaza Iteratore.

Fail-Fast sustavi prekidaju rad što je brže moguće izlažući kvarove odmah i zaustavljajući cijelu operaciju.

Dok, Sigurnosni sustavi ne prekidaju radnju u slučaju kvara. Takvi sustavi nastoje što je moguće više izbjegavati podizanje kvarova.

2. Neuspješno Iteratore

Neuspjeli iteratori u Javi ne igraju se kad se temeljna kolekcija izmijeni.

Zbirke održavati interni brojač zvan modCount. Svaki put kad se stavka doda ili ukloni iz Kolekcija, ovaj brojač se povećava.

Kad se ponavlja, na svakom Sljedeći() poziv, trenutna vrijednost modCount dobiva u usporedbi s početnom vrijednošću. Ako postoji neusklađenost, ona baca ConcurrentModificationException što prekida cijelu operaciju.

Zadani iteratori za Zbirke iz java.util paket kao što su ArrayList, HashMapitd. su brzi.

ArrayList numbers = // ... Iterator iterator = numbers.iterator (); while (iterator.hasNext ()) {Integer number = iterator.next (); brojevi.dodaj (50); }

U isječku koda gore, ConcurrentModificationException baca se na početak sljedećeg iteracijskog ciklusa nakon što je izvršena modifikacija.

Postupak brzog neuspjeha nije zajamčeno u svim scenarijima jer je nemoguće predvidjeti ponašanje u slučaju istodobnih izmjena. Ovi iteratori bacaju ConcurrentModificationException uz najbolji napor.

Ako je tijekom iteracije preko a Kolekcija, stavka se uklanja pomoću Iterator‘S ukloniti() metoda, koja je potpuno sigurna i ne donosi iznimku.

Međutim, ako je Kolekcija‘S ukloniti() metoda se koristi za uklanjanje elementa, ona donosi iznimku:

ArrayList numbers = // ... Iterator iterator = numbers.iterator (); while (iterator.hasNext ()) {if (iterator.next () == 30) {iterator.remove (); // u redu! }} iterator = numbers.iterator (); while (iterator.hasNext ()) {if (iterator.next () == 40) {numbers.remove (2); // iznimka}}

3. Iteratori koji nisu sigurni u kvaru

Neuspješni iteratori favoriziraju nedostatak kvarova zbog neugodnosti postupanja s iznimkama.

Ti iteratori stvaraju klon stvarnog Kolekcija i itera nad njim. Ako se dogodi bilo kakva izmjena nakon stvaranja iteratora, kopija i dalje ostaje netaknuta. Dakle, ovi Iteratore nastavi petljati po Kolekcija čak i ako je izmijenjen.

Međutim, važno je imati na umu da ne postoji iterator uistinu siguran za greške. Točan je izraz slabo dosljedan.

To znaci, ako aKolekcija je modificiran dok se ponavlja, što je Iterator vidi slabo je zajamčena. Ovo se ponašanje može razlikovati kod različitih Zbirke i dokumentiran je u Javadocs-u svakog takvog Kolekcija.

Neuspješno Iteratore ipak ima nekoliko nedostataka. Jedan je nedostatak što Iterator nije zajamčeno da će vratiti ažurirane podatke s Kolekcija, jer radi na klonu umjesto na stvarnom Kolekcija.

Drugi nedostatak je općenito stvaranje kopije Kolekcija, kako u pogledu vremena tako i pamćenja.

Iteratore na Zbirke iz java.util.concurrent paket poput ConcurrentHashMap, CopyOnWriteArrayListitd. po svojoj su prirodi nesigurni.

Mapa ConcurrentHashMap = nova ConcurrentHashMap (); map.put ("Prva", 10); map.put ("Drugi", 20); map.put ("Treći", 30); map.put ("Četvrti", 40); Iterator iterator = map.keySet (). Iterator (); while (iterator.hasNext ()) {String key = iterator.next (); map.put ("Peti", 50); }

U gore navedenom isječku koda koristimo zaštitu od pogreške Iterator. Stoga, iako je novi element dodan u Kolekcija tijekom iteracije ne donosi iznimku.

Zadani iteratorza ConcurrentHashMap je slabo dosljedan. To znači da ovo Iterator može tolerirati istodobnu modifikaciju, prelazi elemente onako kako su postojali kada Iterator je konstruiran i može (ali nije zajamčeno) odražavati promjene na Kolekcija nakon izgradnje Iterator.

Dakle, u isječku koda gore, ponavljanje petlje pet puta, što znači otkriva novo dodani element u Kolekcija.

4. Zaključak

U ovom uputstvu vidjeli smo što je sigurno i brzo Iteratore znače i kako se oni implementiraju u Javi.

Kompletni kôd predstavljen u ovom članku dostupan je na GitHub-u.