¿Cuál es la diferencia entre usar la clase wrapper,, SynchronizedMap
en a HashMap
y ConcurrentHashMap
?
¿Es solo poder modificar el HashMap
mientras lo itera ( ConcurrentHashMap
)?
Sincronizado HashMap
:
Cada método se sincroniza utilizando un bloqueo de nivel de objeto. Entonces, los métodos get y put en synchMap adquieren un bloqueo.
Bloquear toda la colección es una sobrecarga de rendimiento. Mientras un hilo se aferra a la cerradura, ningún otro hilo puede usar la colección.
ConcurrentHashMap
fue introducido en JDK 5.
No hay bloqueo en el nivel del objeto. El bloqueo tiene una granularidad mucho más fina. Para a ConcurrentHashMap
, los bloqueos pueden estar en un nivel de depósito de hashmap.
El efecto del bloqueo de nivel inferior es que puede tener lectores y escritores concurrentes, lo que no es posible para colecciones sincronizadas. Esto lleva a mucha más escalabilidad.
ConcurrentHashMap
no arroja un ConcurrentModificationException
si un hilo intenta modificarlo mientras otro está iterando sobre él.
Este artículo Java 7: HashMap vs ConcurrentHashMap es una muy buena lectura. Muy recomendable.
Hashtable
ySynchronized HashMap
?ConcurrentHashMap
elsize()
resultado podría estar desactualizado.size()
se le permite devolver una aproximación en lugar de un recuento exacto de acuerdo con el libro "Concurrencia de Java en la práctica". Por lo tanto, este método debe usarse con cuidado.La respuesta corta:
Ambos mapas son implementaciones de la
Map
interfaz seguras para subprocesos .ConcurrentHashMap
se implementa para un mayor rendimiento en casos donde se espera una alta concurrencia.El artículo de Brian Goetz sobre la idea detrás
ConcurrentHashMap
es una muy buena lectura. Muy recomendable.fuente
Map m = Collections.synchronizedMap(new HashMap(...));
docs.oracle.com/javase/7/docs/api/java/util/HashMap.htmlConcurrentHashMap
es seguro para subprocesos sin sincronizar todo el mapa. Las lecturas pueden ocurrir muy rápido mientras que la escritura se realiza con un candado.fuente
Podemos lograr la seguridad del subproceso mediante el uso de ConcurrentHashMap y synchronizedHashmap. Pero hay mucha diferencia si nos fijamos en su arquitectura.
fuente
Ambas son versiones sincronizadas de HashMap, con diferencia en su funcionalidad principal y su estructura interna.
ConcurrentHashMap consta de segmentos internos que se pueden ver como HashMaps conceptualmente independientes. Todos estos segmentos pueden ser bloqueados por hilos separados en altas ejecuciones concurrentes. Por lo tanto, varios subprocesos pueden obtener / colocar pares clave-valor de ConcurrentHashMap sin bloquearse / esperar el uno al otro. Esto se implementa para un mayor rendimiento.
mientras
Collections.synchronizedMap () , obtenemos una versión sincronizada de HashMap y se accede de forma bloqueada. Esto significa que si varios subprocesos intentan acceder a SynchronizedMap al mismo tiempo, se les permitirá obtener / colocar pares clave-valor uno a la vez de manera sincronizada.
fuente
ConcurrentHashMap
utiliza un mecanismo de bloqueo más fino conocidolock stripping
para permitir un mayor grado de acceso compartido. Debido a esto, proporciona una mejor concurrencia y escalabilidad .También los iteradores devueltos
ConcurrentHashMap
son débilmente consistentes en lugar de la técnica de falla rápida utilizada por Synchronized HashMap.fuente
Métodos para
SynchronizedMap
mantener el bloqueo en el objeto, mientras queConcurrentHashMap
hay un concepto de "franjas de bloqueo" donde los bloqueos se mantienen en cubos del contenido. Por lo tanto, mejora la escalabilidad y el rendimiento.fuente
ConcurrentHashMap:
1) Ambos mapas son implementaciones seguras para subprocesos de la interfaz Map.
2) ConcurrentHashMap se implementa para un mayor rendimiento en casos donde se espera una alta concurrencia.
3) No hay bloqueo en el nivel del objeto.
Mapa de hash sincronizado:
1) Cada método se sincroniza utilizando un bloqueo de nivel de objeto.
fuente
ConcurrentHashMap permite el acceso concurrente a los datos. Todo el mapa está dividido en segmentos.
Operación de lectura, es decir.
get(Object key)
no está sincronizado incluso a nivel de segmento.Pero escribir operaciones es decir.
remove(Object key), get(Object key)
adquirir bloqueo a nivel de segmento. Solo parte del mapa completo está bloqueado, otros hilos aún pueden leer valores de varios segmentos excepto uno bloqueado.SynchronizedMap por otro lado, adquiere bloqueo a nivel de objeto. Todos los hilos deben esperar al hilo actual independientemente de la operación (lectura / escritura).
fuente
Una prueba de rendimiento simple para ConcurrentHashMap vs Synchronized HashMap . El flujo de prueba está llamando
put
en un subproceso y llamandoget
en tres subprocesosMap
simultáneamente. Como dijo @trshiv, ConcurrentHashMap tiene un mayor rendimiento y velocidad para cuya operación de lectura sin bloqueo. El resultado es que cuando se acaban los tiempos de operación10^7
, ConcurrentHashMap es2x
más rápido que Synchronized HashMap.fuente
SynchronizedMap
yConcurrentHashMap
ambos son de clase segura para subprocesos y se pueden usar en aplicaciones multiproceso, la principal diferencia entre ellos es en cuanto a cómo logran la seguridad de los subprocesos.SynchronizedMap
adquiere bloqueo en toda la instancia de Map, mientrasConcurrentHashMap
divide la instancia de Map en múltiples segmentos y el bloqueo se realiza en esos.fuente
Según java doc's
fuente