Fail-Safe Iterator vs Fail-Fast Iterator

1. Introduksjon

I denne artikkelen vil vi introdusere begrepet Fail-Fast og Fail-Safe Iteratorer.

Fail-Fast-systemer avbryter drift så raskt som mulig, og avslører feil umiddelbart og stopper hele operasjonen.

Mens, Failsafe-systemer avbryter ikke en operasjon i tilfelle en feil. Slike systemer prøver å unngå å heve feil så mye som mulig.

2. Fail-Fast Iteratorer

Mislykkede iteratorer i Java spiller ikke sammen når den underliggende samlingen blir endret.

Samlinger opprettholde en intern teller kalt modCount. Hver gang et element blir lagt til eller fjernet fra Samling, blir denne telleren økt.

Når det gjentas, på hver neste () samtale, gjeldende verdi av modCount blir sammenlignet med startverdien. Hvis det ikke er samsvar, kaster det ConcurrentModificationException som avbryter hele operasjonen.

Standard iteratorer for Samlinger fra java.util-pakke som for eksempel ArrayList, HashMaposv. er feilrask.

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

I kodebiten ovenfor viser ConcurrentModificationException blir kastet i begynnelsen av neste iterasjonssyklus etter at modifikasjonen ble utført.

Fail-Fast-oppførselen skjer ikke garantert i alle scenarier, da det er umulig å forutsi atferd i tilfelle modifikasjoner. Disse iteratorene kaster ConcurrentModificationException på best mulig basis.

Hvis under iterasjon over en Samling, et element fjernes ved hjelp av Iterator‘S fjerne() metode, det er helt trygt og kaster ikke et unntak.

Imidlertid, hvis Samling‘S fjerne() metoden brukes for å fjerne et element, kaster det et unntak:

ArrayList numbers = // ... Iterator iterator = numbers.iterator (); mens (iterator.hasNext ()) {if (iterator.next () == 30) {iterator.remove (); // ok! }} iterator = numbers.iterator (); while (iterator.hasNext ()) {if (iterator.next () == 40) {numbers.remove (2); // unntak}}

3. Feilsikre ikteratorer

Fail-Safe iterators favoriserer mangel på feil på grunn av ulempen med unntakshåndtering.

Disse iteratorene skaper en klon av det faktiske Samling og iterere over det. Hvis noen endringer skjer etter at iteratoren er opprettet, forblir kopien fortsatt uberørt. Derfor disse Iteratorer fortsett å løkke over Samling selv om den er modifisert.

Det er imidlertid viktig å huske at det ikke er noe som heter en virkelig feilsikker iterator. Den riktige betegnelsen er svakt konsistent.

Det betyr, hvis enSamling er modifisert mens den blir iterert over, hva Iterator ser er svakt garantert. Denne oppførselen kan være forskjellig for forskjellige Samlinger og er dokumentert i Javadocs av ​​hvert slikt Samling.

Mislykket Iteratorer har imidlertid noen ulemper. En ulempe er at Iterator er ikke garantert å returnere oppdaterte data fra Samling, ettersom det fungerer på klonen i stedet for selve Samling.

En annen ulempe er overhead for å lage en kopi av Samling, både når det gjelder tid og minne.

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

ConcurrentHashMap-kart = nytt 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 ()) {Strengnøkkel = iterator.next (); map.put ("Femte", 50); }

I kodebiten ovenfor bruker vi Fail-Safe Iterator. Derfor, selv om et nytt element blir lagt til Samling under iterasjonen kaster det ikke noe unntak.

Standard iteratorfor ConcurrentHashMap er svakt konsistent. Dette betyr at dette Iterator tåler samtidig modifikasjon, krysser elementer slik de eksisterte da Iterator ble konstruert og kan (men er ikke garantert) gjenspeile endringer i Samling etter byggingen av Iterator.

Derfor, i kodebiten ovenfor, løper iterasjonen fem ganger, noe som betyr det oppdager det nylig tilføyde elementet til Samling.

4. Konklusjon

I denne opplæringen har vi sett hva Fail-Safe og Fail-Fast Iteratorer mener og hvordan disse implementeres i Java.

Den komplette koden presentert i denne artikkelen er tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found