Iteratori fail fast e fail safe in Java: qual è la differenza?



Questo articolo su 'Fail Fast and Fail Safe Iterators' ti aiuterà a confrontare questi due iteratori in dettaglio con esempi pertinenti.

supporta due tipi di iteratori, il primo è veloce e il secondo è sicuro. Questi svolgono un ruolo fondamentale quando si tratta di gestire le eccezioni in Java. In questo articolo su 'Fail Fast and Fail Safe Iterators', analizzeremo il funzionamento dei due iteratori e la differenza essenziale tra loro.

Di seguito sono riportati i suggerimenti da discutere in questo articolo:





grafico ad anello vs grafico a torta

Prima di entrare in una spiegazione dettagliata, familiarizziamo con il concetto di modifica simultanea.

Modifica simultanea

Quando un singolo thread (o più thread), itera su una raccolta, può modificare la struttura della raccolta, aggiungendo o eliminando l'elemento nella raccolta o aggiornando il valore dell'elemento in una posizione particolare. Questo processo è noto come modifica simultanea.



Diamo rapidamente uno sguardo ai due Sistemi che riguardano l'argomento di cui sopra, prima di entrare nel dettaglio dello stesso,

Fail Fast System:

Un sistema viene etichettato come sistema fail fast, se si arresta immediatamente dopo il verificarsi di un errore. Le operazioni vengono interrotte istantaneamente e vengono esposti i guasti o gli errori.

Sistema fail-safe:

Un sistema viene etichettato come sistema fail-safe, se continuano a funzionare anche dopo che si è verificato un guasto o un errore. Non interrompono un'operazione e nascondono gli errori invece di esporli.



Gli iteratori in java ci consentono di attraversare gli oggetti Collection. Gli iteratori restituiti dalla raccolta sono di natura fail fast o fail safe.

Fail Fast Iterator

Gli iteratori veloci in errore in Java non consentono alcun tipo di modifica strutturale a una raccolta durante l'iterazione su di essa. La modifica strutturale include l'aggiunta, la rimozione o l'aggiornamento di qualsiasi elemento nella raccolta durante l'iterazione su di esso. L'iteratore genera un'eccezione ConcurrentModificationException, se una raccolta viene modificata strutturalmente durante il processo di iterazione.

Tuttavia, è necessario notare che se un elemento viene rimosso utilizzando il metodo degli iteratori, ovvero il metodo remove (), non viene generata alcuna eccezione. È un processo completamente sicuro. assicurati di avere java installato sul tuo sistema

Esempio di Iteratore Fail Fast:

import java.util.HashMap import java.util.Iterator import java.util.Map public class FailFastExample {public static void main (String [] args) {Map monthIndex = new HashMap () monthIndex.put ('1', 'gennaio ') monthIndex.put (' 2 ',' February ') monthIndex.put (' 3 ',' March ') Iterator iterator = monthIndex.keySet (). iterator () while (iterator.hasNext ()) {System.out .println (monthIndex.get (iterator.next ())) // l'aggiunta di un elemento a Map // verrà lanciata un'eccezione alla chiamata successiva // del metodo next (). monthIndex.put ('4', 'April')}}}

Produzione:

Eccezione nel thread 'main' java.util.ConcurrentModificationException

in java.util.HashMap $ HashIterator.nextEntry (origine sconosciuta)

è meglio di kotlin di java

Ora andiamo avanti e diamo un'occhiata a Fail Safe Iterator,

Iteratore a prova di errore

A differenza degli iteratori Fail Fast, gli iteratori Fail Safe non generano eccezioni se la raccolta viene modificata durante il processo di iterazione. Ciò è dovuto al fatto che iterano sul clone della raccolta, anziché sulla raccolta effettiva. Le modifiche strutturali apportate alla collezione attuale passano inosservate.

Tuttavia, va notato che non esiste un vero Iteratore Fail Safe. Sarebbe appropriato definirlo come debolmente coerente. Questo significa semplicemente quello Se una Collection viene modificata durante il processo di iterazione, ciò che vede l'iteratore è debolmente garantito. Questo comportamento è diverso per le diverse raccolte ed è documentato in Javadocs.

Esempio di iteratore fail-safe:

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', 'aprile')}}}

Produzione:

  • gennaio
  • febbraio
  • marzo

Infine in questo articolo confronteremo questi iteratori,

Differenze: Iteratore Fail Fast e Fail Safe

Di seguito sono riportate le differenze essenziali tra i due iteratori:

Parametri Fail Fast Iterator Iteratore a prova di errore
Genera eccezione ConcurrentModification

Sì, generano CocurrentModificationExcepti-on se una raccolta viene modificata durante l'iterazione su di essa.

No, non generano alcuna eccezione se una raccolta viene modificata durante l'iterazione su di essa.

Clona la raccolta

No, usano la collezione originale per attraversare gli elementi.

Sì, usano la copia della collezione originale per attraversare.

Overhead di memoria

No, non richiedono memoria aggiuntiva.

Sì, richiedono memoria aggiuntiva per clonare la raccolta.

Esempi

HashMap, Vector, ArrayList, HashSet

CopyOnWriteArrayList

Questi iteratori sono unici e molto necessari nel versatile linguaggio di java. Sebbene il fail safe abbia un anello confortante, l'iteratore fail fast si dimostra robusto.

Questo porta alla fine di questo articolo. nel caso in cui desideri saperne di più, controlla il di Edureka. Il corso di formazione e certificazione Java J2EE e SOA di Edureka è progettato per darti un vantaggio nella programmazione Java e addestrarti per i concetti Java di base e avanzati insieme a vari framework Java come Hibernate e Spring.

Hai domande per noi? Si prega di menzionarlo nella sezione commenti di questo blog 'Fail Fast vs Fail Safe' e ti risponderemo il prima possibile.

somiglianze tra java e javascript