Rýchle zlyhanie a zlyhanie bezpečných iterátorov v prostredí Java: Aký je rozdiel?



Tento článok s názvom „Rýchle a bezpečné zlyhanie iterátorov“ vám pomôže podrobne porovnať tieto dva iterátory s príslušnými príkladmi.

podporujú dva typy iterátorov, prvý je rýchly a druhý bezpečný. Tieto majú zásadnú úlohu pri spracovávaní výnimiek v Jave. V tomto článku nazvanom „Fail Fast And Fail Safe Iterators“ budeme analyzovať činnosť týchto dvoch iterátorov, ako aj ich podstatný rozdiel.

Nasledujú ukazovatele, o ktorých sa bude diskutovať v tomto článku:





Predtým, ako sa dostaneme k podrobnému vysvetleniu, oboznámme sa s konceptom súbežnej úpravy.

Súbežná úprava

Keď sa jedno vlákno (alebo viac vlákien) opakuje v kolekcii, môže zmeniť štruktúru kolekcie pridaním alebo odstránením prvku v kolekcii alebo aktualizáciou hodnoty prvku v konkrétnej polohe. Tento proces je známy ako súbežná modifikácia.



Poďme sa rýchlo pozrieť na dva systémy, ktoré sa týkajú vyššie uvedenej témy, skôr ako sa dostaneme k podrobnostiam toho istého,

Rýchly systém zlyhania:

Systém je označený ako systém rýchleho zlyhania, ak sa okamžite vypne po výskyte chyby. Operácie sa okamžite prerušia a odhalia sa zlyhania alebo chyby.

Fail Safe System:

Systém je označený ako bezpečný systém, ak naďalej funguje aj po poruche alebo chybe. Nerušia operáciu a namiesto odhalenia chýb chyby skryjú.



Iterátory v Jave nám umožňujú prechádzať cez objekty Collection. Iterátory vrátené kolekciou sú buď zlyhané rýchlo, alebo zlyhajú bezpečne.

Fail Fast Iterator

Rýchle iterátory zlyhania v prostredí Java zakazujú akýkoľvek typ štrukturálnych úprav kolekcie pri jej iterácii. Štrukturálna modifikácia zahŕňa pridanie, odstránenie alebo aktualizáciu ľubovoľného prvku v kolekcii pri jej iterácii. Iterátor vyvolá ConcurrentModificationException, ak je kolekcia štrukturálne upravená počas procesu iterácie.

Je však potrebné poznamenať, že ak je položka odstránená pomocou vlastnej metódy iterátorov, t. J. Pomocou metódy remove (), nie je vyvolaná žiadna výnimka. Je to úplne bezpečný proces. Uistite sa, že máte java nainštalovaná vo vašom systéme

Príklad zlyhania rýchleho iterátora:

import java.util.HashMap import java.util.Iterator import java.util.Map verejná trieda FailFastExample {public static void main (String [] args) {Map monthIndex = nový HashMap () monthIndex.put ('1', 'január ') monthIndex.put (' 2 ',' február ') monthIndex.put (' 3 ',' marec ') Iterator iterator = monthIndex.keySet (). iterator () while (iterator.hasNext ()) {System.out .println (monthIndex.get (iterator.next ())) // pridanie prvku do Map // výnimka bude vyvolaná pri ďalšom volaní // metódy next (). monthIndex.put ('4', 'April')}}}

Výkon:

Výnimka vo vlákne „main“ java.util.ConcurrentModificationException

na java.util.HashMap $ HashIterator.nextEntry (neznámy zdroj)

Teraz sa poďme pozrieť na Fail Safe Iterator,

Fail Safe Iterator

Na rozdiel od Fail Fast iterátorov, Fail Safe iterátory nevyvolávajú žiadne výnimky, ak sa kolekcia počas procesu iterácie zmení. Je to spôsobené tým, že iterujú na klone zbierky namiesto skutočnej zbierky. Štrukturálne úpravy vykonané na skutočnej kolekcii si ich nevšimnú.

Treba si však uvedomiť, že neexistuje nič také ako skutočne Fail Safe Iterator. Bolo by vhodné to označiť ako slabo konzistentné. To jednoducho znamená ak zbierka sa počas procesu iterácie upravuje, to, čo vidí Iterátor, je slabo zaručené. Toto správanie sa líši pre rôzne kolekcie a je zdokumentované v Javadocs.

Príklad Fail Safe Iterator:

public class 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')}}}

Výkon:

  • Januára
  • Februára
  • Marca

Nakoniec v tomto článku porovnáme tieto iterátory,

Rozdiely: zlyhanie rýchle a bezpečné zlyhanie

Ďalej sú uvedené základné rozdiely medzi týmito dvoma iterátormi:

Parametre Fail Fast Iterator Fail Safe Iterator
Vyhodiť výnimku ConcurrentModification

Áno, hodí CocurrentModificationExcepti-on, ak je kolekcia počas iterácie upravená.

Nie, nevyvolávajú žiadnu výnimku, ak je kolekcia počas iterácie upravená.

Naklonujte zbierku

Nie, na prechod cez prvky používajú pôvodnú zbierku.

Áno, na prechádzanie používajú kópiu pôvodnej zbierky.

Pamäť nad hlavou

Nie, nevyžadujú ďalšiu pamäť.

Áno, na naklonovanie zbierky vyžadujú ďalšiu pamäť.

ako nainštalovať php na Windows
Príklady

HashMap, Vector, ArrayList, HashSet

CopyOnWriteArrayList

Tieto iterátory sú jedinečné a veľmi potrebné vo všestrannom jazyku Java. Aj keď má Failure Safe utišujúci krúžok, rýchlo sa opakujúci iterátor sa ukazuje ako robustný.

Týmto sa končí tento článok. Ak sa chcete dozvedieť viac, pozrite si od Edureka. Výcvikový a certifikačný kurz Edureka Java J2EE a SOA je navrhnutý tak, aby vám dal náskok v programovaní v jazyku Java a naučil vás základné aj pokročilé koncepty Java spolu s rôznymi rámcami Java, ako je Hibernate & Spring.

Máte na nás otázku? Uveďte to v sekcii komentárov tohto blogu „Fail Fast vs Fail Safe“ a my sa vám ozveme čo najskôr.