¿Cuál es la diferencia entre usar la clase wrapper,, SynchronizedMapen a HashMapy ConcurrentHashMap?
¿Es solo poder modificar el HashMapmientras 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.
ConcurrentHashMapno arroja un ConcurrentModificationExceptionsi 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.
HashtableySynchronized HashMap?ConcurrentHashMapelsize()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
Mapinterfaz seguras para subprocesos .ConcurrentHashMapse implementa para un mayor rendimiento en casos donde se espera una alta concurrencia.El artículo de Brian Goetz sobre la idea detrás
ConcurrentHashMapes una muy buena lectura. Muy recomendable.fuente
Map m = Collections.synchronizedMap(new HashMap(...));docs.oracle.com/javase/7/docs/api/java/util/HashMap.htmlConcurrentHashMapes 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
ConcurrentHashMaputiliza un mecanismo de bloqueo más fino conocidolock strippingpara permitir un mayor grado de acceso compartido. Debido a esto, proporciona una mejor concurrencia y escalabilidad .También los iteradores devueltos
ConcurrentHashMapson débilmente consistentes en lugar de la técnica de falla rápida utilizada por Synchronized HashMap.fuente
Métodos para
SynchronizedMapmantener el bloqueo en el objeto, mientras queConcurrentHashMaphay 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
puten un subproceso y llamandogeten tres subprocesosMapsimultá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 es2xmás rápido que Synchronized HashMap.fuente
SynchronizedMapyConcurrentHashMapambos 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.SynchronizedMapadquiere bloqueo en toda la instancia de Map, mientrasConcurrentHashMapdivide la instancia de Map en múltiples segmentos y el bloqueo se realiza en esos.fuente
Según java doc's
fuente