Neuspešni in neuspešni varni iteratorji v Javi: v čem je razlika?



Ta članek o »Fail Fast and Fail Safe Iterators« vam bo pomagal podrobno primerjati ta dva iteratorja z ustreznimi primeri.

podpirajo dve vrsti iteratorjev, prvi je hiter, drugi pa varen. Ti igrajo ključno vlogo pri ravnanju z izjemami v Javi. V tem članku o 'Fail Fast And Fail Safe Iterators' bomo analizirali delovanje obeh iteratorjev in bistveno razliko med njima.

Sledijo napotki, o katerih bomo razpravljali v tem članku:





Preden se podrobno razložimo, se seznanimo s konceptom sočasne spremembe.

Sočasna sprememba

Ko se posamezna nit (ali več niti) ponovi nad zbirko, lahko spremeni strukturo zbirke bodisi z dodajanjem ali brisanjem elementa v zbirki bodisi s posodabljanjem vrednosti elementa na določenem položaju. Ta postopek je znan kot sočasna sprememba.



Poglejmo si na hitro dva sistema, ki zadevata zgornjo temo, preden se lotimo podrobnosti istega,

Fail Fast Sysetm:

Sistem je označen kot sistem za hitro odpoved, če se izklopi takoj po pojavu napake. Operacije se takoj prekinejo in napake ali napake so izpostavljene.

Nevarni sistem:

Sistem je označen kot sistem, ki varno deluje, če še naprej deluje tudi po napaki ali napaki. Operacije ne prekinejo in napake skrijejo, namesto da bi jih razkrili.



Iteratorji v javi nam omogočajo prehod čez predmete zbirke. Ponovitve, ki jih vrne zbirka, bodisi hitro odpovejo bodisi so varne.

Fail Fast Iterator

Hitri iteratorji v Java ne dovolijo kakršne koli strukturne spremembe zbirke, medtem ko se nad njo ponovijo. Strukturna sprememba vključuje dodajanje, odstranjevanje ali posodabljanje katerega koli elementa v zbirki med iteracijo po njej. Iterator vrže ConcurrentModificationException, če je zbirka med postopkom ponovitve strukturno spremenjena.

Vendar je treba opozoriti, da če element odstranimo z uporabo lastne metode iteratorjev, tj. Metode remove (), ne vrne nobene izjeme. To je popolnoma varen postopek. se prepričajte, da imate nameščena java v vašem sistemu

Primer Fail Fast Iterator:

import java.util.HashMap import java.util.Iterator import java.util.Map javni razred FailFastExample {public static void main (String [] args) {Map monthIndex = new HashMap () monthIndex.put ('1', 'January ') monthIndex.put (' 2 ',' February ') monthIndex.put (' 3 ',' March ') Iterator iterator = monthIndex.keySet (). iterator () while (iterator.hasNext ()) {System.out .println (monthIndex.get (iterator.next ())) // dodajanje elementa v Map // izjema bo vrženo ob naslednjem klicu // metode next (). monthIndex.put ('4', 'April')}}}

Izhod:

Izjema v niti 'main' java.util.ConcurrentModificationException

na java.util.HashMap $ HashIterator.nextEntry (neznan vir)

java pretvori binarno v decimalno

Zdaj pa poglejmo Fail Safe Iterator,

Neuspešen Iterator

Za razliko od Fail Fast iteratorjev Fail Safe iteratorji ne povzročajo izjem, če je zbirka spremenjena med postopkom ponovitve. To je posledica dejstva, da se ponovijo na klonu zbirke, namesto na dejanski zbirki. Strukturne spremembe na dejanski zbirki zanje ostanejo neopažene.

Vendar je treba opozoriti, da resnično ne deluje Iterator Safe. Primerno bi bilo, če bi ga poimenovali šibko dosleden. To preprosto pomeni če Zbirka se spremeni med postopkom ponovitve, kar vidi Iterator, je šibko zagotovljeno. To se pri različnih zbirkah razlikuje in je dokumentirano v Javadocs.

Primer Iteratorja, ki ne deluje varno:

javni razred FailSafeExample {public static void main (String [] args) {ConcurrentMap monthIndex = new ConcurrentHashMap () monthIndex.put ('1', 'January') monthIndex.put ('2', 'February') monthIndex.put ( '3', 'March') Iterator iterator = monthIndex.keySet (). Iterator () while (iterator.hasNext ()) {System.out.println (monthIndex.get (iterator.next ())) monthIndex.put ( '4', 'April')}}}

Izhod:

  • Januarja
  • Februarja
  • Marec

Na koncu bi v tem članku primerjali te iteratorje,

Razlike: Fail Fast in Fail Safe Iterator

Spodaj so bistvene razlike med obema iteratorjema:

Parametri Fail Fast Iterator Neuspešen Iterator
Vrzi izjemo ConcurrentModification

Da, vržejo CocurrentModificationExcepti-on, če je zbirka spremenjena med ponovitvijo nad njo.

Ne, ne vržejo nobene izjeme, če je zbirka spremenjena med ponovitvijo nad njo.

Klonirajte zbirko

Ne, za prehod po elementih uporabljajo originalno zbirko.

Da, za prehod uporabljajo kopijo izvirne zbirke.

Spomin nad glavo

Ne, ne potrebujejo dodatnega pomnilnika.

Da, za kloniranje zbirke potrebujejo dodaten pomnilnik.

Primeri

HashMap, Vector, ArrayList, HashSet

CopyOnWriteArrayList

Ti ponovitelji so edinstveni in zelo potrebni v vsestranskem jeziku Java. Čeprav ima varnostni obroč tolažilni obroč, se izkaže, da je hiter iterator močan.

S tem se ta članek konča. če želite izvedeti več, si oglejte avtor Edureka. Edurekin tečaj za usposabljanje in certificiranje Java J2EE in SOA je zasnovan tako, da vam nudi uvod v programiranje Java in vas usposobi za osnovne in napredne koncepte Java, skupaj z različnimi Java okviri, kot sta Hibernate & Spring.

Imate vprašanje za nas? Prosimo, omenite ga v oddelku za komentarje tega spletnega dnevnika »Fail Fast vs Fail Safe« in v najkrajšem možnem času se vam bomo oglasili.