¿El método forEach de ConcurrentHashMap es seguro para subprocesos? [duplicar]

Jan 05 2021

Si desea iterar sobre todos los elementos en ConcurrentHashMap, ¿está utilizando el forEachmétodo seguro para subprocesos?

Respuestas

1 JohnKugelman Jan 05 2021 at 11:08

Depende de lo que quieras decir con seguro para subprocesos.

  • Si está de acuerdo con que otros subprocesos puedan modificar el mapa mientras está en medio de una forEachllamada, entonces sí, es seguro para subprocesos.
  • Si desea que el mapa no se pueda modificar mientras forEachestá en progreso, de modo que otros subprocesos se bloqueen o se produzcan errores si intentan modificarlo, entonces no, no lo es.

La documentación de la API dice:

Sin embargo, aunque todas las operaciones son seguras para la ejecución de subprocesos, las operaciones de recuperación no implican el bloqueo y no existe ningún soporte para bloquear toda la tabla de una manera que impida todo acceso.

...

De manera similar, los iteradores, divisores y 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 arrojan ConcurrentModificationException.... Tenga en cuenta que los resultados de los métodos de estado agregados ... suelen ser útiles solo cuando un mapa no se actualiza simultáneamente en otros hilos. De lo contrario, los resultados de estos métodos reflejan estados transitorios que pueden ser adecuados para fines de seguimiento o estimación, pero no para el control del programa.