En javadoc para ConcurrentHashMap está lo siguiente:
Las operaciones de recuperación (incluida la obtención) generalmente no se bloquean, por lo que pueden superponerse con las operaciones de actualización (incluida la colocación y eliminación). Las recuperaciones reflejan los resultados de las operaciones de actualización completadas más recientemente en espera de su inicio. Para operaciones agregadas como putAll y clear, las recuperaciones simultáneas pueden reflejar la inserción o eliminación de solo algunas entradas. Del mismo modo, los iteradores y las enumeraciones devuelven elementos que reflejan el estado de la tabla hash en algún momento en o desde la creación del iterador / enumeración. No lanzan ConcurrentModificationException. Sin embargo, los iteradores están diseñados para ser utilizados por un solo hilo a la vez.
Qué significa eso? ¿Qué sucede si intento iterar el mapa con dos hilos al mismo tiempo? ¿Qué sucede si pongo o elimino un valor del mapa mientras lo itero?
ConcurrentModificationException
tiempo iterandoConcurrentHashMap
, ¿por qué?Puede usar esta clase para probar dos hilos de acceso y uno que mute la instancia compartida de
ConcurrentHashMap
:No se lanzará ninguna excepción.
Compartir el mismo iterador entre hilos de acceso puede conducir a un punto muerto:
Tan pronto como comience a compartir lo mismo
Iterator<Map.Entry<String, String>>
entre los hilos de acceso y mutadoresjava.lang.IllegalStateException
, comenzarán a aparecer.fuente
Significa que no debe compartir un objeto iterador entre varios subprocesos. Crear múltiples iteradores y usarlos simultáneamente en hilos separados está bien.
fuente
Esto podría darte una buena idea
Con respecto a este:
Esto significa que, si bien el uso de iteradores producidos por ConcurrentHashMap en dos subprocesos es seguro, puede causar un resultado inesperado en la aplicación.
fuente
Significa que no debe intentar usar el mismo iterador en dos hilos. Si tiene dos hilos que necesitan iterar sobre las claves, valores o entradas, cada uno debe crear y usar sus propios iteradores.
No está del todo claro qué sucedería si infringe esta regla. Podría obtener un comportamiento confuso, de la misma manera que lo hace si (por ejemplo) dos hilos intentan leer desde la entrada estándar sin sincronizar. También podría obtener un comportamiento no seguro para subprocesos.
Pero si los dos hilos utilizan iteradores diferentes, debería estar bien.
Ese es un tema separado, pero la sección de javadoc que citó lo responde adecuadamente. Básicamente, los iteradores son seguros para subprocesos, pero no está definido si verá los efectos de cualquier inserción, actualización o eliminación simultánea reflejada en la secuencia de objetos devueltos por el iterador. En la práctica, probablemente depende de en qué lugar del mapa ocurran las actualizaciones.
fuente