java multithreading hashmap java.util.concurrent

java - Rosca seguro Hash Map?



multithreading hashmap (3)

ConcurrentHashMap fue diseñado e implementado para evitar cualquier problema con los escenarios que describe. No tienes nada de qué preocuparte.

Una tabla hash que admite concurrencia completa de recuperaciones y concurrencia esperada ajustable para updates.updates.

javadoc de ConcurrentHashMap

Estoy escribiendo una aplicación que devolverá un HashMap al usuario. El usuario obtendrá una referencia a este MAP. En el back-end, ejecutaré algunos hilos que actualizarán el Mapa.

¿Qué he hecho hasta ahora?

Hice todos los hilos de fondo para compartir un canal común para actualizar el MAP. Por lo tanto, al final, estoy seguro de que la operación de escritura concurrente no será un problema.

Problemas que estoy teniendo

  1. Si el usuario intenta actualizar el MAP y al mismo tiempo MAP se está actualizando en el backend -> Problema de operación simultánea de escritura.
  2. Si el uso intenta leer algo de MAP y al mismo tiempo MAP se está actualizando en el back-end -> concurrente LEER y ESCRIBIR problema de operación.

Hasta ahora no me he enfrentado a ningún problema, pero tengo miedo de enfrentarme en el futuro. Por favor, den sugestiones

Estoy usando ConcurrentHashMap<String, String>.


Estás en el camino correcto usando ConcurrentHashMap . Para cada punto:

  1. Comprueba los métodos putIfAbsent y replace both threadsafe y combina la comprobación del estado actual de hashmap y actualízalo en una operación atómica.
  2. El método get no está sincronizado internamente, pero devolverá el valor más reciente para la clave especificada disponible (consulte la ConcurrentHashMap ).

El beneficio de ConcurrentHashMap sobre algo como Collections.synchronizedMap es la combinación de métodos como putIfAbsent que proporcionan la tradicional lógica de get y put en mapa de forma internamente sincronizada. Utilice estos métodos y no intente proporcionar su propia sincronización personalizada en ConcurrentHashMap ya que no funcionará. Las colecciones java.util.concurrent están sincronizadas internamente y otros hilos no responderán a los intentos de sincronización del objeto (por ejemplo, synchronize(myConcurrentHashMap){} no bloqueará otros hilos).


Nota al costado:

Es posible que desee examinar la implementación de la tabla hash libre de bloqueo por Cliff Click, es parte de la biblioteca altamente escalable de Java

(Aquí hay un Google Talk de Cliff Click sobre este hash libre de bloqueo).