Fail-Safe Iterator vs Fail-Fast Iterator

1. Introduktion

I denne artikel introducerer vi begrebet Fail-Fast og Fail-Safe Iteratorer.

Fejlhurtige systemer afbryder drift så hurtigt som muligt og afslører straks fejl og stopper hele operationen.

Der henviser til, Fejlsikre systemer afbryder ikke en handling i tilfælde af en fejl. Sådanne systemer forsøger at undgå at hæve fejl så meget som muligt.

2. Fejl-hurtig Iteratorer

Fejlhurtige iteratorer i Java spiller ikke sammen, når den underliggende samling bliver ændret.

Samlinger opretholde en intern tæller kaldet modCount. Hver gang et element tilføjes eller fjernes fra Kollektion, denne tæller forøges.

Når det gentages, på hver Næste() opkald, den aktuelle værdi af modCount bliver sammenlignet med den oprindelige værdi. Hvis der er en uoverensstemmelse, kaster det ConcurrentModificationException som afbryder hele operationen.

Standard iteratorer til Samlinger fra java.util-pakke såsom ArrayList, HashMaposv. er Fail-Fast.

ArrayList numre = // ... Iterator iterator = numbers.iterator (); mens (iterator.hasNext ()) {Integer number = iterator.next (); numbers.add (50); }

I kodestykket ovenfor er ConcurrentModificationException bliver kastet i begyndelsen af ​​en næste iterationscyklus, efter at ændringen blev udført.

Fejl-hurtig opførsel sker ikke garanteret i alle scenarier, da det er umuligt at forudsige adfærd i tilfælde af samtidige ændringer. Disse iteratorer kaster ConcurrentModificationException på en bedst mulig basis.

Hvis under iteration over en Kollektion, et element fjernes ved hjælp af Iterator'S fjerne() metode, det er helt sikkert og kaster ikke en undtagelse.

Men hvis den Kollektion'S fjerne() metode bruges til at fjerne et element, det kaster en undtagelse:

ArrayList numre = // ... Iterator iterator = numbers.iterator (); mens (iterator.hasNext ()) {if (iterator.next () == 30) {iterator.remove (); // Okay! }} iterator = numbers.iterator (); mens (iterator.hasNext ()) {if (iterator.next () == 40) {numbers.remove (2); // undtagelse}}

3. Fejlsikre ikteratorer

Fejlsikre iteratorer favoriserer manglende fejl i forhold til ulejligheden ved undtagelse.

Disse iteratorer skaber en klon af den aktuelle Kollektion og gentages over det. Hvis der sker ændringer, efter at iteratoren er oprettet, forbliver kopien stadig uberørt. Derfor disse Iteratorer Fortsæt looping over Kollektion selvom det er ændret.

Det er dog vigtigt at huske, at der ikke er sådan noget som en virkelig fejlsikker iterator. Den korrekte betegnelse er svagt konsekvent.

Det betyder, hvis enKollektion er ændret, mens den gentages, hvad den Iterator ser er svagt garanteret. Denne adfærd kan være anderledes for forskellige Samlinger og er dokumenteret i Javadocs af hver sådan Kollektion.

Fejlsikker Iteratorer har dog et par ulemper. En ulempe er, at Iterator returnerer ikke opdaterede data fra Kollektion, da det arbejder på klonen i stedet for den faktiske Kollektion.

En anden ulempe er omkostningerne ved at oprette en kopi af Kollektion, både med hensyn til tid og hukommelse.

IteratorerSamlinger fra java.util.concurrent pakke som f.eks ConcurrentHashMap, CopyOnWriteArrayListosv. er fejlsikker.

ConcurrentHashMap-kort = nyt ConcurrentHashMap (); map.put ("First", 10); map.put ("Second", 20); map.put ("Tredje", 30); map.put ("Fjerde", 40); Iterator iterator = map.keySet (). Iterator (); mens (iterator.hasNext ()) {String key = iterator.next (); map.put ("Femte", 50); }

I kodestykket ovenfor bruger vi Fail-Safe Iterator. Derfor, selvom et nyt element føjes til Kollektion under iteration kaster det ikke en undtagelse.

Standard iteratorentil ConcurrentHashMap er svagt konsekvent. Dette betyder, at dette Iterator tåler samtidig ændring, krydser elementer, som de eksisterede da Iterator blev konstrueret og kan (men er ikke garanteret) afspejle ændringer i Kollektion efter opførelsen af Iterator.

Derfor, i kodestykket ovenfor, slår iteration fem gange, hvilket betyder det registrerer det nyligt tilføjede element til Kollektion.

4. Konklusion

I denne vejledning har vi set hvad Fail-Safe og Fail-Fast Iteratorer betyder, og hvordan disse implementeres i Java.

Den komplette kode, der præsenteres i denne artikel, er tilgængelig på GitHub.