Pregunta

Necesito un HashMap que es accesible desde varios subprocesos.

Hay dos opciones simples, utilizando un HashMap normal y la sincronización en él o utilizando un ConcurrentHashMap.

Desde ConcurrentHashMap no bloquea en las operaciones de lectura que parece mucho más adecuado para mis necesidades (lee casi exclusivamente, casi nunca actualizaciones). Por otra parte, espero muy baja concurrencia de todos modos, así que no debería haber ningún bloqueo (sólo el coste de la gestión de la cerradura).

El mapa también será muy pequeño (menos de diez entradas), si eso hace la diferencia.

En comparación con un HashMap regular, cuánto más costosas son las operaciones de lectura y escritura (estoy asumiendo que son)? ¿O es simplemente ConcurrentHashMap siempre mejor cuando podría ser incluso un nivel moderado de acceso concurrente, independientemente del coeficiente de lectura / actualización y el tamaño?

¿Fue útil?

Solución

Por otro lado, espero que muy baja concurrencia de todos modos, así que no debería haber ningún bloqueo (sólo el coste de la gestión de la cerradura).

El coste de adquisición y liberación de un uncontend mutex Java (bloqueo primitivo) es minúsculo . Así que si usted cree que la probabilidad de contención es muy baja, se HashMap sencilla es probablemente la mejor opción.

Pero todo esto es una conjetura. A menos que y hasta que realmente ha perfilado su aplicación, todo el tiempo dedicado a la optimización especulativa es más probable (*) la pérdida de tiempo.

* ... a menos que tenga un realmente buena intuición.

Otros consejos

CHM paga una pena para el uso de Atomic * operaciones bajo las sábanas, en comparación con HashMap. ¿Cuánto cuesta? Supongo que lo que ... medirlo en su aplicación ...; -)

Si usted encuentra que usted realmente tiene un problema de rendimiento, es probable que haya una solución muy especializado de <10 entradas que sería más barato que cualquier solución de ensamblado de la tierra java.util, pero no saltaría a que hasta que sepa que tiene un problema de rendimiento.

En términos de rendimiento y el rendimiento, la sobrecarga es generalmente despreciable.

En una nota diferente, la huella de memoria de un ConcurrentHashMap (a nivel de instancia) es algo mayor que un HashMap. Si usted tiene un gran número de mecanismos de facilitación de pequeño tamaño, esta sobrecarga puede sumar.

El problema principal w / CHM:. Que no se adapta bien a menos que cambie la llamada c-tor, pero sobre todo no se escala automáticamente para los núcleos disponibles

3 enlaces siguientes para bloquear libre HashMap
http://www.azulsystems.com/blog / acantilado-clic / 2007-03-26-no-bloqueo-tabla hash
http: //www.azulsystems .com / blog / acantilado-clic / 2007-04-01-no-bloqueo-tabla hash-parte-2
http://sourceforge.net/projects/high-scale-lib/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top