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.