Il existe deux types d'itérateurs en Java: à sécurité intégrée et à sécurité intégrée.
Qu'est-ce que cela signifie et est la différence entre eux?
java
iterator
terminology
Prateek
la source
la source
Réponses:
«Fail-safe» ( en ingénierie ) signifie que quelque chose échoue d'une manière qui ne cause aucun dommage ou un dommage minimal. À proprement parler, il n'existe pas en Java d'itérateur à sécurité intégrée. Si un itérateur échoue (dans le sens normal de «échec»), vous pouvez vous attendre à ce que des dommages se produisent.
Je soupçonne que vous entendez en fait des itérateurs "faiblement cohérents". Le javadoc dit:
En règle générale, une cohérence faible signifie que si une collection est modifiée en même temps qu'une itération, les garanties de ce que voit l'itération sont plus faibles. (Les détails seront spécifiés dans chaque javadocs de classes de collection simultanées.)
«Fail-fast» ( dans la conception des systèmes ) signifie que la condition de défaillance est vérifiée de manière agressive afin que la condition de défaillance soit (si possible 1 ) détectée avant que trop de dommages ne puissent être causés. En Java, un itérateur rapide échoue en lançant un fichier
ConcurrentModificationException
.L'alternative à "fail-fast" et "faiblement cohérent" est sémantique là où l'itération échoue de manière imprévisible; par exemple pour donner parfois la mauvaise réponse ou lancer une exception inattendue. (C'était le comportement de certaines implémentations standard de l'
Enumeration
API dans les premières versions de Java.)Non. Ce sont les propriétés des itérateurs implémentés par les types Collection standard; c'est-à-dire qu'ils sont soit "échouent rapidement" soit "faiblement cohérents" ... lorsqu'ils sont utilisés correctement par rapport à la synchronisation et au modèle de mémoire Java 1 .
Les itérateurs à échec rapide sont généralement implémentés à l'aide d'un
volatile
compteur sur l'objet de collection.Iterator
, la valeur actuelle du compteur est incorporée dans l'Iterator
objet.Iterator
opération est effectuée, la méthode compare les deux valeurs de compteur et lance un CME si elles sont différentes.En revanche, les itérateurs faiblement cohérents sont généralement légers et tirent parti des propriétés des structures de données internes de chaque collection simultanée. Il n'y a pas de modèle général. Si vous êtes intéressé, lisez le code source des différentes classes de collection.
1 - Le cavalier est que le comportement Fail-Fast suppose que l'application identifie correctement par rapport à la synchronisation et au modèle de mémoire. Cela signifie que (par exemple) si vous effectuez une itération
ArrayList
sans synchronisation appropriée, le résultat peut être un résultat de liste corrompu. Le mécanisme "d'échec rapide" détectera probablement la modification simultanée (bien que ce ne soit pas garanti), mais il ne détectera pas la corruption sous-jacente. À titre d'exemple, javadoc forVector.iterator()
dit ceci:la source
setArray
n'importe quelle modification.Ce sont des types plutôt rapides et faiblement cohérents :
Les itérateurs du
java.util
package lancentConcurrentModificationException
si la collection a été modifiée par les méthodes de la collection (ajouter / supprimer) lors de l'itérationLes itérateurs du
java.util.concurrent
package itèrent généralement sur un instantané et autorisent des modifications simultanées, mais peuvent ne pas refléter les mises à jour de la collection après la création de l'itérateur.la source
Iterator
ni l' autre ou neEnumeration
spécifiez le comportement comme fail-fast ou fail-safe. Ce sont des implémentations spécifiques (c'est-à-dire les méthodes spécifiques de la collectioniterator()
/elements()
etc qui retournent ces objets) qui spécifient le comportement. 2) Les implémentations typiques d'énumération ne sont ni rapides ni sûres .La seule différence est que l'itérateur de sécurité ne lance aucune exception, contrairement à l'itérateur rapide.
Si la collection est modifiée structurellement pendant qu'un thread l'itère. En effet, ils fonctionnent sur le clone de la collection au lieu de la collection originale et c'est pourquoi ils sont appelés itérateur de sécurité.
Iterator of CopyOnWriteArrayList est un exemple d'itérateur à sécurité intégrée également un itérateur écrit par ConcurrentHashMap keySet est également un itérateur à sécurité intégrée et ne lance jamais ConcurrentModificationException en Java.
la source
Ce scénario concerne le "traitement simultané", ce qui signifie que plus d'un utilisateur accède à la même ressource. Dans une telle situation, l'un des utilisateurs essaie de modifier cette ressource, ce qui cause l'exception «ConcurrentProcessingException» car dans ce cas, d'autres utilisateurs obtiennent des données incorrectes. Ces deux types se rapportent à ce genre de situation.
En termes simples,
Échec rapide:
Fail-Safe:
la source