Rychlé selhání a bezpečné iterátory v Javě: Jaký je rozdíl?



Tento článek s názvem „Rychlé a bezpečné selhání iterátorů“ vám pomůže tyto dva iterátory podrobně porovnat s příslušnými příklady.

podporují dva typy iterátorů, první je rychlý a druhý bezpečný. Ty hrají zásadní roli, pokud jde o zpracování výjimek v Javě. V tomto článku nazvaném „Fail Fast And Fail Safe Iterators“ budeme analyzovat fungování těchto dvou iterátorů a také zásadní rozdíly mezi nimi.

Následují ukazatele, o nichž se bude diskutovat v tomto článku:





Než se pustíme do podrobného vysvětlení, seznámíme se s konceptem souběžné úpravy.

Souběžná úprava

Když jedno vlákno (nebo více vláken) iteruje přes kolekci, může změnit strukturu kolekce, a to buď přidáním nebo odstraněním prvku v kolekci, nebo aktualizací hodnoty prvku na konkrétní pozici. Tento proces se nazývá souběžná modifikace.



Pojďme se rychle podívat na dva systémy, které se týkají výše uvedeného tématu, než se dostaneme k podrobnostem stejného,

Selhání rychlého systému:

Systém je označen jako rychlý systém pro selhání, pokud se okamžitě vypne po výskytu chyby. Operace se okamžitě přeruší a odhalí se chyby nebo chyby.

Fail Safe System:

Systém je označen jako bezpečný systém, pokud nadále funguje i po poruše nebo výskytu chyby. Nepřeruší operaci a skryjí chyby, místo aby je odhalily.



Iterátory v Javě nám umožňují procházet objekty Collection. Iterátory vrácené kolekcí jsou buď rychle selhávající, nebo bezpečně selhávající.

Fail Fast Iterator

Selhání rychlých iterátorů v Javě znemožňuje jakýkoli typ strukturální úpravy kolekce při iteraci nad ní. Strukturální úprava zahrnuje přidání, odebrání nebo aktualizaci libovolného prvku v kolekci při iteraci nad ní. Iterátor vyvolá ConcurrentModificationException, pokud je kolekce strukturně upravena během procesu iterace.

Je však třeba poznamenat, že pokud je položka odebrána pomocí vlastní metody iterátorů, tj. Metody remove (), není vyvolána žádná výjimka. Je to zcela bezpečný proces. ujistěte se, že máte java nainstalována ve vašem systému

Příklad Fail Fast Iterator:

import java.util.HashMap import java.util.Iterator import java.util.Map veřejná třída FailFastExample {public static void main (String [] args) {Map monthIndex = new HashMap () monthIndex.put ('1', 'leden ') monthIndex.put (' 2 ',' únor ') monthIndex.put (' 3 ',' březen ') Iterator iterator = monthIndex.keySet (). iterator () while (iterator.hasNext ()) {System.out .println (monthIndex.get (iterator.next ())) // přidání prvku do Map // výjimka bude vyvolána při příštím volání // metody next (). monthIndex.put ('4', 'April')}}}

Výstup:

Výjimka ve vlákně „main“ java.util.ConcurrentModificationException

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

Pojďme se nyní podívat na Fail Safe Iterator,

Fail Safe Iterator

Na rozdíl od Fail Fast iterátorů, Fail Safe iterátory nevyvolávají žádné výjimky, pokud je kolekce během procesu iterace změněna. To je způsobeno skutečností, že iterují na klon kolekce namísto skutečné kolekce. Strukturální úpravy provedené na skutečné kolekci jimi nejsou povšimnuty.

Je však třeba si uvědomit, že nic takového jako skutečně Fail Safe Iterator neexistuje. Bylo by vhodné to označit jako slabě konzistentní. To jednoduše znamená -li Kolekce je během procesu iterace upravena, to, co Iterator vidí, je slabě zaručeno. Toto chování se u různých kolekcí liší a je zdokumentováno v Javadocs.

Pří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ýstup:

  • leden
  • Únor
  • březen

Nakonec v tomto článku porovnáme tyto iterátory,

Rozdíly: Selhání rychlé a bezpečné selhání Iterátor

Níže jsou uvedeny podstatné rozdíly mezi těmito dvěma iterátory:

Parametry Fail Fast Iterator Fail Safe Iterator
Vyvolání výjimky ConcurrentModification

Ano, hodí CocurrentModificationExcepti-on, pokud je kolekce během iterace upravena.

Ne, nevyvolávají žádnou výjimku, pokud je kolekce během iterace změněna.

Naklonujte sbírku

Ne, k procházení prvky používají originální kolekci.

Ano, k procházení používají kopii původní sbírky.

Paměť nad hlavou

Ne, nevyžadují extra paměť.

Ano, ke klonování kolekce vyžadují další paměť.

nejlepší java ide pro Windows
Příklady

HashMap, Vector, ArrayList, HashSet

CopyOnWriteArrayList

Tyto iterátory jedinečné a velmi potřebné ve všestranném jazyce Java. I když má Fail Safe Safe utěšující prsten, iterátor Fail Fast se ukazuje jako robustní.

Tím se dostáváme na konec tohoto článku. v případě, že se chcete dozvědět více, podívejte se na podle Edureka. Školicí a certifikační kurz Edureka Java J2EE a SOA je navržen tak, aby vám poskytl náskok v programování Java a naučil vás základní i pokročilé koncepty Java spolu s různými rámci Java, jako je Hibernate & Spring.

Máte na nás dotaz? Uveďte to prosím v sekci komentářů tohoto blogu „Fail Fast vs Fail Safe“ a my se vám ozveme co nejdříve.