2012-02-19 13 views
6

Tengo una estructura de datos de mapa compartida que necesita ser segura para subprocesos. ¿Se sincroniza la forma más eficiente de leer o agregar al mapa?La forma más eficiente de hacer que una estructura de datos sea segura (Java)

Gracias!

Editar: La estructura de datos es un caché no actualizable, es decir, una vez que se llena no actualiza el caché. Así que muchas de las escrituras inicialmente con algunas lecturas, en su mayoría se lee

Respuesta

6

"Más eficiente" es relativo, por supuesto, y depende de su situación específica. Pero considere algo como ConcurrentHashMap si espera que haya muchos hilos trabajando simultáneamente con el mapa; es seguro para hilos, pero aún permite el acceso simultáneo, a diferencia de Hashtable o Collections.synchronizedMap().

0

métodos sincronizados o colecciones sin duda funcionarán. No es el enfoque más eficiente, pero es fácil de implementar y no notará la sobrecarga a menos que tenga acceso a la estructura millones de veces por segundo.

Una mejor idea podría ser utilizar ConcurrentHashMap - esto fue diseñado para la concurrencia desde el principio y debería funcionar mejor en una situación altamente concurrente.

3

Eso depende de cómo lo use en la aplicación.

Si estás haciendo un montón de lectura y escritura en él, un ConcurrentHashMap es posiblemente la mejor opción, si es en su mayoría de leer, un mapa común envuelto en una colección usando un ReadWriteLock (ya que las escrituras no serían comunes, Tendría acceso más rápido y bloqueo solo al escribir).

Collections.synchronizedMap() es posiblemente el peor de los casos, ya que podría proporcionarle un contenedor con todos los métodos sincronizados, evítelo a toda costa.

1

Para su caso de uso específico (caché no actualizable), una copia en el mapa de escritura superará tanto a un mapa sincronizado como a ConcurrentHashMap.

Vea: https://labs.atlassian.com/wiki/display/CONCURRENT/CopyOnWriteMap como un ejemplo (creo que apache también tiene una copia en la implementación del mapa de escritura).

+0

El enlace parece haber cambiado a - https://bitbucket.org/atlassian/atlassian-util-concurrent/wiki/CopyOnWrite%20Maps –

Cuestiones relacionadas