2012-01-05 7 views

Respuesta

12

Fail-fast significa que cuando intenta modificar el contenido cuando está iterando a través de él, falla y lanza ConcurrentModificationException.

Set keys = hashMap.keySet(); 
for (Object key : keys) { 
    hashMap.put(someObject, someValue); //it will throw the ConcurrentModificationException here 
} 

para la enumeración HashTable:

Enumeration keys = hashTable.keys(); 
while (keys.hasMoreElements()) { 
      hashTable.put(someKey, someValue); //this is ok 
    } 
+3

Los iteradores de Hastable son rápidos. Sus enumeraciones no son. –

+0

¡Tienes razón! ¡Gracias! – evanwong

3

Al llamar iterator.next(), en su caso la modificación se ha hecho entre el momento en el repetidor se creó y el momento next() que se llama, un ConcurrentModificationException se lanza inmediatamente. Esto es lo que significa "fallar rápido".

Las enumeraciones devueltas por Hashtable no tienen este comportamiento. Suponen que usted sabe lo que está haciendo, y su comportamiento, AFAIK, no está definido si modifica el mapa mientras lo itera utilizando una de sus enumeraciones.

3

La mejor manera es probablemente mirar la fuente para cada clase implementada por la implementación Open JDK para cada clase; de esa manera, puede obtener su respuesta directamente de la boca del caballo, como si fuera :-)

Dejando eso de lado, esencialmente, "fail-fast" en este sentido significa que un Iterador sobre un HashMap lanzará una excepción si detecta que otro subproceso ha modificado el HashMap específico - si busca en el código fuente de HashMap, verá que esto se hace simplemente marcando un contador para la cantidad de modificaciones esperadas. Si el recuento de modificaciones es diferente de lo esperado por el iterador, eso significa que alguien más ha entrado desde el último control y ha manipulado el HashMap, por lo que el iterador lanza un ConcurrentModificationException.

Un iterador "no a prueba de fallas" no se molestaría en comprobarlo, y felizmente seguiría su negocio en la estructura de datos subyacente. Por lo tanto, obtienes cierta flexibilidad (probablemente dudosa flexibilidad en este caso) a cambio de posibles errores posteriores; es decir, intentar acceder a un valor que ya no está presente.

Como con todas las estrategias fail-fast, la idea es que cuanto más temprano se detecta un error, más fácil es recuperarlo o depurarlo.

+3

No sólo otro hilo. Si modifica el mapa mientras lo itera, incluso en el mismo subproceso, se lanza una Modificación simultánea (excepto si usa el iterador mismo para modificar el mapa) –

+0

¡Muy cierto! Un error a veces confuso que he hecho yo mismo :-) –

Cuestiones relacionadas