Siempre pensé que ConcurrentHashMap
y clases similares (que mantienen actualizaciones sincronizadas y no sincronizan las lecturas) fueron muy útiles e intuitivas: no bloquearon las lecturas y bloquearon toda la funcionalidad en las actualizaciones. Y una estrategia como esa mantiene todas las cosas consistentes.ConcurrentHashMap: ¿cuál es el punto de bloqueo de actualizaciones solamente?
pero he leído la documentación cuidadosamente, y abrió la implementación de ConcurrentHashMap
, y como yo lo entiendo ahora, no bloque lee cuando otro flujo está realizando actualizaciones. Y si un hilo comienza a hacer putAll(hugeCollection)
y otro hilo repite contains(theSameObjectForAllCalls)
al mismo tiempo, entonces es más probable que el segundo hilo obtenga resultados diferentes, mientras que putAll
sigue funcionando.
Aquí está la parte relacionada de la documentación:
Para las operaciones de agregados tales como putAll y claras, concurrentes recuperaciones pueden reflejar inserción o eliminación de solamente algunas entradas.
Otra cosa interesante es que:
Retrievals reflejan los resultados de las operaciones de actualización concluidos más recientes sostienen sobre su aparición.
Esto no funciona debido a un bloqueo, sino porque primero se añade un nuevo objeto y sólo después de que los objetos se incrementa el contador y el objeto se vuelve visible para operaciones de lectura.
Entonces, ¿cuál es el objetivo de las actualizaciones de bloqueo?
Gracias a Dios por Brian y Doug, sus libros me han rescatado muchas veces en la navegación a alta mar de concurrencia. –