2012-04-25 15 views
7

Concurrent Hashmap podría resolver el problema de sincronización que se ve en hashmap. Por lo tanto, agregar y eliminar sería rápido si estamos utilizando sincronizar el trabajo de la clave con hashmap. ¿Qué pasa si se comprueba el tamaño de hashmap, si varios hilos comprueban el tamaño concurrente deHashMap? Qué necesidad tenemos ya synchronzation clave: algo de la siguiente manera:HashMap concurrente: comprobación de tamaño

public static synchronized getSize(){ 
    return aConcurrentHashmap.size(); 
} 

Respuesta

8

concurentHashMap.size() devolverá el tamaño conocido en el momento de la llamada, pero podría ser un valor obsoleto cuando use ese número porque otro subproceso ha agregado/eliminado elementos mientras tanto.

Sin embargo, el objetivo de ConcurrentMaps es que no necesita sincronizarlo ya que es una colección segura para subprocesos.

1

Usted no necesita utilizar sincronizado con ConcurretnHashMap excepto en muy raras ocasiones en que es necesario realizar múltiples operaciones de forma atómica.

Para obtener el tamaño, puede llamarlo sin sincronización.


para aclarar cuándo me gustaría utilizar la sincronización con ConcurrentHashMap ...

Digamos que tienes un objeto caro que desea crear bajo demanda. Desea lecturas concurrentes, pero también quiere asegurarse de que los valores solo se creen una vez.

public ExpensiveObject get(String key) { 
    return map.get(key); // can work concurrently. 
} 

public void put(String key, ExepensiveBuilder builder) { 
    // cannot use putIfAbsent because it needs the object before checking. 
    synchronized(map) { 
     if (!map.containsKey(key)) 
      map.put(key, builder.create()); 
    } 
} 

Nota: Esto requiere que todas las escrituras estén sincronizadas, pero las lecturas aún pueden ser concurrentes.

+0

ConcurrentHashMap se sincroniza internamente. Agregar sus propios bloques de sincronización en la parte superior puede no darle lo que desea. – krock

+0

@krock Tienes que tener cuidado de cómo lo usas. Agregar un ejemplo. –

2

Simplemente puede llamar al aConcurrentHashmap.size(). Sin embargo, debes tener en cuenta que para cuando recibas la respuesta, puede que ya esté obsoleta. Esto sucedería si otro hilo modificase al mismo tiempo el mapa.

0

Los diseñadores de ConcurrentHashMap idea de dar weightage a operaciones individuales como: get(), put() y remove() sobre los métodos que operan sobre HashMap completa como isEmpty() o size(). Esto se hace porque los cambios de estos métodos llamados (en general) son menores que los otros métodos individuales.

No es necesaria una sincronización para size() aquí. Podemos obtener el tamaño llamando al método concurentHashMap.size(). Este método puede devolver valores obsoletos, ya que otros hilos pueden modificar el mapa mientras tanto. Pero, se asume explícitamente que se ha roto ya que estas operaciones están despriorizadas.