2009-08-18 12 views

Respuesta

64

sincronizados HashMap:

  1. Cada método se sincroniza mediante un bloqueo a nivel de objeto. Entonces, los métodos get y put de synchMap adquieren un bloqueo.

  2. Bloquear toda la colección es una sobrecarga de rendimiento. Mientras que un hilo se aferra al candado, ningún otro hilo puede usar la colección.

ConcurrentHashMap se introdujo en JDK 5.

  1. No hay bloqueo a nivel de objeto, el bloqueo está en una granularidad mucho más fina. Para un ConcurrentHashMap, los bloqueos pueden estar en un nivel de cubo hashmap.

  2. El efecto del bloqueo de nivel inferior es que puede tener lectores y escritores concurrentes que no es posible para colecciones sincronizadas. Esto lleva a mucha más escalabilidad.

  3. ConcurrentHashMap no arroja un ConcurrentModificationException si un hilo intenta modificarlo mientras otro itera sobre él.

Este artículo Java 7: HashMap vs ConcurrentHashMap es una muy buena lectura. Muy recomendable.

+3

Entonces, ¿cuál es la diferencia entre 'Hashtable' y' Synchronized HashMap'? – roottraveller

+0

Entre un ConcurrentHashMap y un HashMap sincronizado, ¿cuál recomienda? – Blunderchips

76

La respuesta corta:

Ambos mapas son implementaciones compatibles con el proceso de la interfaz Map. ConcurrentHashMap se implementa para un mayor rendimiento en casos donde se espera alta concurrencia.

Brian Goetz's article en la idea detrás de ConcurrentHashMap es una muy buena lectura. Muy recomendable.

+0

¿Qué es esto? HashMap: Tenga en cuenta que esta aplicación no está sincronizado para evitar el acceso no sincronizado accidentales sufridos por el mapa: Mapa 'm = Collections.synchronizedMap (nuevo HashMap (...));' http: // docs. oracle.com/javase/7/docs/api/java/util/HashMap.html – karate

+3

"El artículo de Brian Goetz ... es una muy buena lectura". - Y aún más es su libro "Concurrencia de Java en la práctica". –

24

ConcurrentHashMap es seguro para hilos sin sincronizar todo el mapa. Las lecturas pueden suceder muy rápido mientras la escritura se realiza con un bloqueo.

5

ConcurrentHashMap usa un mecanismo de bloqueo de grano fino conocido como lock stripping para permitir un mayor grado de acceso compartido. Debido a esto, proporciona una mejor concurrencia y escalabilidad.

también iteradores devuelto para ConcurrentHashMap son débilmente consistente en lugar de falla técnica rápida utilizado por sincronizada HashMap.

2

Métodos en SynchronizedMap mantener el bloqueo en el objeto, mientras que en ConcurrentHashMap hay un concepto de "bloqueo de franjas" donde los bloqueos se mantienen en cubos de los contenidos en su lugar. Por lo tanto, mejor escalabilidad y rendimiento.

1

ConcurrentHashMap:

1) Ambos mapas son implementaciones compatibles con el proceso de la interfaz del mapa.

2) ConcurrentHashMap se implementa para un mayor rendimiento en los casos donde se espera una alta concurrencia.

3) No hay bloqueo en el nivel del objeto.

sincronizada Hash Mapa:

1) Cada método se sincroniza mediante un bloqueo a nivel de objeto.

7

Ambos son versiones sincronizadas de HashMap, con una diferencia en su funcionalidad central y su estructura interna.

ConcurrentHashMap consisten en segmentos internos que se pueden ver como HashMaps Conceptualmente. Todos estos segmentos pueden bloquearse por subprocesos separados en ejecuciones concurrentes altas. Por lo tanto, varios subprocesos pueden obtener/poner pares clave-valor de ConcurrentHashMap sin bloquear/esperar el uno al otro. Esto se implementa para un mayor rendimiento.

mientras que

Collections.synchronizedMap(), obtenemos una versión sincronizada de HashMap y se accede a ella en el bloqueo de forma. Esto significa que si varios subprocesos intentan acceder a synchronizedMap al mismo tiempo, se les permitirá obtener/poner pares clave-valor uno a la vez de manera sincronizada.

5

Podemos lograr seguridad de subprocesos utilizando tanto ConcurrentHashMap como synchronizedHashmap. Pero hay una gran diferencia si miras su arquitectura.

  1. synchronisedHashmap

que mantendrá el bloqueo a nivel del objeto. Entonces, si desea realizar cualquier operación como put/get, primero debe adquirir el candado. Al mismo tiempo, otros hilos no pueden realizar ninguna operación. Entonces, a la vez, solo un hilo puede operar en esto. Entonces, el tiempo de espera aumentará aquí. Podemos decir que el rendimiento es relativamente bajo cuando se compara con ConcurrentHashMap.

  1. ConcurrentHashMap

que mantendrá el bloqueo a nivel de segmento. Tiene 16 segmentos y mantiene el nivel de concurrencia como 16 por defecto. Entonces, a la vez, 16 subprocesos pueden funcionar en ConcurrentHashMap. Además, la operación de lectura no requiere un bloqueo. Entonces, cualquier número de subprocesos puede realizar una operación de obtención en él.

Si thread1 quiere realizar la operación de inserción en el segmento 2 y thread2 quiere realizar la operación de puesta en el segmento 4, entonces está permitido aquí. Significa que 16 subprocesos pueden realizar operaciones de actualización (put/delete) en ConcurrentHashMap a la vez.

Para que el tiempo de espera sea menor aquí. Por lo tanto, el rendimiento es relativamente mejor que el Hashmap sincronizado.

0

ConcurrentHashMap permite el acceso simultáneo a los datos. El mapa completo está dividido en segmentos.

Operación de lectura, es decir. get(Object key) no está sincronizado ni siquiera a nivel de segmento.

Pero escribir operaciones, es decir. remove(Object key), get(Object key) adquiere el bloqueo a nivel de segmento. Solo parte del mapa completo está bloqueado, otros hilos aún pueden leer valores de varios segmentos, excepto el bloqueado.

SincronizaciónMapa Por otro lado, adquiere el bloqueo a nivel del objeto. Todos los hilos deben esperar el hilo actual independientemente de la operación (Lectura/Escritura).