¿El método forEach de ConcurrentHashMap es seguro para subprocesos? [duplicar]
Si desea iterar sobre todos los elementos en ConcurrentHashMap, ¿está utilizando el forEach
método seguro para subprocesos?
Respuestas
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
forEach
llamada, entonces sí, es seguro para subprocesos. - Si desea que el mapa no se pueda modificar mientras
forEach
está 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.