1. Fail-fast (fallo rápido)

Al usar un iterador para recorrer un objeto de colección, si se modifica el contenido del objeto de colección durante el recorrido (agregar, eliminar, modificar), se lanzará una Concurrent Modification Exception.

Principio:Durante el recorrido, el iterador accede directamente al contenido de la colección y utiliza una variable modCount en el proceso. Si el contenido de la colección cambia mientras se recorre, se modifica el valor de modCount. Cada vez que el iterador usa hashNext()/next() para recorrer el siguiente elemento, verifica si la variable modCount es igual al valor expectedmodCount; si lo es, continúa el recorrido; de lo contrario, lanza una excepción y termina el recorrido.

Nota:La condición para lanzar la excepción aquí es detectarmodCount != expectedmodCountesta condición. Si cuando la colección cambia, el valor de modCount modificado resulta ser igual al valor de expectedmodCount, la excepción no se lanzará. Por lo tanto, no se debe programar operaciones concurrentes dependiendo de si se lanza esta excepción; esta excepción solo se recomienda para detectar errores de modificación concurrente.

Escenario:Las clases de colección bajo el paquete java.util son todas de fail-fast; no pueden sufrir modificaciones concurrentes en un entorno multihilo (modificadas durante el proceso de iteración).

2. Fail-safe (fallo seguro)

Los contenedores de colecciones que utilizan el mecanismo de fail-safe no acceden directamente al contenido de la colección al recorrer, sino que primero copian el contenido original de la colección y recorren la copia de la colección.

Principio:Dado que la iteración se realiza sobre una copia de la colección original, las modificaciones hechas a la colección original durante el recorrido no pueden ser detectadas por el iterador, por lo que no se activa la Concurrent Modification Exception.

> Desventajas:La ventaja de basarse en el contenido copiado es que se evita la Concurrent Modification Exception, pero de igual manera, el iterador no puede acceder al contenido modificado, es decir: el iterador recorre la copia de la colección obtenida en el momento en que comenzó la iteración, y el iterador no conoce las modificaciones que ocurran en la colección original durante el recorrido.

Escenario:Los contenedores bajo el paquete java.util.concurrent son todos de fail-safe, y se pueden usar y modificar de forma concurrente en múltiples hilos.

Dirección del artículo original: http://www.cnblogs.com/ygj0930/p/6543350.html