Existem dois tipos de iteradores em Java: fail-safe e fail-fast.
O que isso significa e qual é a diferença entre eles?
java
iterator
terminology
Prateek
fonte
fonte
Respostas:
"À prova de falhas" ( em engenharia ) significa que algo falha de uma forma que não causa nenhum ou mínimo dano. A rigor, não existe em Java um iterador à prova de falhas. Se um iterador falhar (no sentido normal de "falha"), você pode esperar que ocorram danos.
Eu suspeito que você realmente quer dizer iteradores "fracamente consistentes". O javadoc diz:
Normalmente, consistência fraca significa que se uma coleção for modificada simultaneamente com uma iteração, as garantias do que a iteração vê são mais fracas. (Os detalhes serão especificados em cada javadocs de classes de coleção simultâneas.)
"Fail-fast" ( no projeto de sistemas ) significa que a condição de falha é verificada agressivamente para que a condição de falha seja (quando possível 1 ) detectada antes que muito dano possa ser feito. Em Java, um iterador rápido falha lançando um
ConcurrentModificationException
.A alternativa para "fail-fast" e "fracamente consistente" é semântica, onde a iteração falha imprevisivelmente; por exemplo, às vezes dar a resposta errada ou lançar uma exceção inesperada. (Esse era o comportamento de algumas implementações padrão da
Enumeration
API nas primeiras versões do Java.)Não. Essas são propriedades dos iteradores implementados por tipos de coleção padrão; ou seja, eles são "falha rápido" ou "consistentes fracamente" ... quando usados corretamente com relação à sincronização e ao modelo de memória Java 1 .
Os iteradores fail-fast são geralmente implementados usando um
volatile
contador no objeto de coleção.Iterator
é criado, o valor atual do contador é incorporado aoIterator
objeto.Iterator
operação é executada, o método compara os dois valores do contador e lança um CME se eles forem diferentes.Por outro lado, iteradores fracamente consistentes são normalmente propriedades leves e de aproveitamento das estruturas de dados internas de cada coleção simultânea. Não existe um padrão geral. Se você estiver interessado, leia o código-fonte para diferentes classes de coleção.
1 - O rider é que o comportamento fail-fast assume que o aplicativo id corretamente com relação à sincronização e ao modelo de memória. Isso significa que (por exemplo) se você iterar um
ArrayList
sem a sincronização adequada, o resultado pode ser um resultado de lista corrompido. O mecanismo de "falha rápida" provavelmente detectará a modificação simultânea (embora isso não seja garantido), mas não detectará a corrupção subjacente. Por exemplo, javadoc paraVector.iterator()
diz o seguinte:fonte
setArray
qualquer modificação.Eles são tipos bastante rápidos e fracamente consistentes :
Iteradores do
java.util
pacote lançamConcurrentModificationException
se a coleção foi modificada pelos métodos da coleção (adicionar / remover) durante a iteraçãoOs iteradores do
java.util.concurrent
pacote geralmente iteram sobre um instantâneo e permitem modificações simultâneas, mas podem não refletir as atualizações da coleção depois que o iterador foi criado.fonte
Iterator
ouEnumeration
especificar o comportamento como fail-rápido ou à prova de falhas. São implementações específicas (ou seja, os métodos específicos de coleçãoiterator()
/elements()
etc que retornam esses objetos) que especificam o comportamento. 2) As implementações típicas de enumeração não são nem rápidas nem à prova de falhas .A única diferença é que o iterador à prova de falhas não lança nenhuma exceção, ao contrário do Iterador rápido à falha.
If Collection é modificado estruturalmente enquanto um thread está iterando sobre ele. Isso ocorre porque eles trabalham no clone da coleção em vez da coleção original e é por isso que são chamados de iteradores à prova de falhas.
Iterator de CopyOnWriteArrayList é um exemplo de Iterator à prova de falhas e também iterador escrito por ConcurrentHashMap keySet também é um iterador à prova de falhas e nunca lança ConcurrentModificationException em Java.
fonte
Este cenário diz respeito ao “processamento concorrente”, significa que mais de um usuário acessa o mesmo recurso. Em tal situação, um dos usuários tenta modificar aquele recurso que causa a 'ConcurrentProcessingException' porque nesse caso outro usuário obtém dados impróprios. Ambos os tipos se relacionam com esse tipo de situação.
Em termos simples,
Fail-Fast:
À prova de falhas:
fonte