2010-11-04 5 views
7

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?

Respuesta

4

Brian Goetz explicó el funcionamiento en un article en trabajos de desarrollador. Eso debería ayudar.

+1

Gracias a Dios por Brian y Doug, sus libros me han rescatado muchas veces en la navegación a alta mar de concurrencia. –

4

Estas clases le dan un control adicional de las compensaciones en torno a la concurrencia frente a la consistencia. Si lo que realmente quieres es tener lecturas atómicas y consistentes, obtén un hashmap sincronizado. Sin embargo, si necesita más simultaneidad, puede obtener un ConcurrentHashMap, siempre que sepa que las lecturas obtendrán una imagen precisa de cómo se veía el mapa en algún momento, pero no necesariamente ahora.

La compensación es que tienes que pensar más en la consistencia de los datos, pero tu aplicación puede tener mucha más concurrencia.

+0

sí, tiendo a pensar en ello como la precisión frente al rendimiento de esa manera. – Toby