Pregunta Qué son los Iteradores a prueba de fallas y a prueba de fallas en Java [cerrado]


Hay dos tipos de iteradores en Java: a prueba de fallas y a prueba de fallas.

¿Qué significa esto, y es la diferencia entre ellos?


75
2018-06-29 06:27


origen


Respuestas:


Cuál es la diferencia entre ellos ...

"Fail safe" significa: no fallará. Estrictamente hablando, hay no tal cosa en Java como un iterador a prueba de fallas. El término correcto es "débilmente consistente". El javadoc dice:

"La mayoría de las implementaciones de Coincidencias concurrentes (incluyendo la mayoría de las Colas) también difieren de las convenciones usuales de java.util en que sus Iteradores y Spliterators proporcionan un recorrido débilmente consistente en lugar de un fracaso rápido".

Típicamente, la consistencia débil significa que si una colección se modifica al mismo tiempo que una iteración, las garantías de lo que la iteración ve son más débiles. (Los detalles se especificarán en cada clase de colección concatenada javadocs).

"Fail Fast" significa: mayo fallar ... y la condición de falla se verifica agresivamente para que la condición de falla sea (cuando sea posible)1) detectado antes de el daño se puede hacer. En Java, un iterador de falla falla al arrojar un ConcurrentModificationException.

La alternativa a "fail-fast" y "débilmente consistente" es una semántica donde la iteración falla impredeciblemente; p.ej. a veces dar la respuesta incorrecta o lanzar una excepción totalmente inesperada. (Este fue el comportamiento de algunas implementaciones estándar de Enumeration API en las primeras versiones de Java).

... y son diferentes del iterador que usamos para la colección.

No. Estos son propiedades de los iteradores implementados por tipos de Colección estándar; es decir, son "a prueba de fallas" o "débilmente consistentes" ... cuando se usan correctamente con respecto a la sincronización y el modelo de memoria de Java1.


Los iteradores a prueba de fallas son típicamente implementado usando un volatile contador en el objeto de colección.

  • Cuando la colección se actualiza, el contador se incrementa.
  • Cuando un Iterator se crea, el valor actual del contador está incrustado en Iterator objeto.
  • Cuando un Iterator se realiza la operación, el método compara los dos valores del contador y arroja un CME si son diferentes.

La implementación de iteradores a prueba de fallas generalmente es liviana. Por lo general, dependen de las propiedades de las estructuras de datos de la implementación de la lista específica. No hay un patrón general (Lea el código fuente de las clases de colecciones específicas en las que está interesado).


1 - El jinete es que el comportamiento a prueba de fallas asume que la aplicación se identifica correctamente con respecto a la sincronización y el modelo de memoria. Eso significa que (por ejemplo) si itera un ArrayList sin la sincronización adecuada, el resultado final podría ser un resultado dañado de la lista. El mecanismo de "falla rápida" probablemente detectará la modificación simultánea (aunque eso no está garantizado), pero no detectará la corrupción subyacente. Como ejemplo, javadoc para Vector.iterator() dice esto:

"El comportamiento a prueba de fallas de un iterador no se puede garantizar, ya que, en términos generales, es imposible hacer ninguna garantía dura en presencia de modificaciones concurrentes no sincronizadas. ConcurrentModificationException sobre la base del mejor esfuerzo. Por lo tanto, sería incorrecto escribir un programa que dependiera de esta excepción para su corrección: el comportamiento a prueba de fallas de los iteradores debería usarse solo para detectar errores ".


68
2018-06-29 07:09



Ellos son bastante Fallar rapido y débilmente consistente tipos:

Iteradores de java.util lanzamiento del paquete ConcurrentModificationException si la colección fue modificada por los métodos de la colección (agregar / eliminar) mientras se itera

Iteradores de java.util.concurrent el paquete generalmente itera sobre una instantánea y permite modificaciones concurrentes, pero puede no reflejar las actualizaciones de la colección después de que se creó el iterador.


30
2018-06-29 06:45



La única diferencia es que el iterador a prueba de fallas no arroja ninguna excepción, contrario al iterador a prueba de fallas.

Si Collection se modifica estructuralmente mientras un hilo se itera sobre él. Esto se debe a que trabajan en la clonación de la colección en lugar de la colección original y es por eso que se llaman como un iterador a prueba de fallas.

El iterador de CopyOnWriteArrayList es un ejemplo de fail-safe Iterator también iterator escrito por ConcurrentHashMap keySet también es un iterador a prueba de fallas y nunca lanza ConcurrentModificationException en Java.


19
2018-06-29 06:31