¿Cuál es la diferencia entre el uso de la clase contenedora, SynchronizedMap
, en un HashMap
y ConcurrentHashMap
? ¿Es solo poder modificar el HashMap
al iterarlo (ConcurrentHashMap
)?ConcurrentHashMap vs sincronizada HashMap
Respuesta
sincronizados HashMap
:
Cada método se sincroniza mediante un bloqueo a nivel de objeto. Entonces, los métodos get y put de synchMap adquieren un bloqueo.
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.
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.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.
ConcurrentHashMap
no arroja unConcurrentModificationException
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.
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.
¿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
"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". –
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.
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.
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.
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.
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.
Podemos lograr seguridad de subprocesos utilizando tanto ConcurrentHashMap como synchronizedHashmap. Pero hay una gran diferencia si miras su arquitectura.
- 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.
- 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.
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).
- 1. Volatile HashMap vs ConcurrentHashMap
- 2. ConcurrentHashMap poner vs putIfAbsent
- 3. Java HashMap vs JSONObject
- 4. Sobrecarga de memoria ConcurrentHashMap
- 5. LinkedHashMap vs HashMap! = LinkedList vs ArrayList
- 6. ¿Hay algún inconveniente con ConcurrentHashMap?
- 7. Java interruptor codificado vs HashMap
- 8. clase de objeto vs Hashmap
- 9. ConcurrentHashMap bloqueo
- 10. Java - Ampliación HashMap - Objeto vs comportamiento genéricos
- 11. EJB 3.1 concurrencia administrada por contenedor vs. sincronizada
- 12. ConcurrentHashMap parámetros de constructor?
- 13. ConcurrentHashMap en Java?
- 14. ConcurrentHashMap para C++
- 15. ConcurrentHashMap instrucciones de reorden?
- 16. ConcurrentHashMap vs ReentrantReadWriteLock Mapa de encargo de acuerdo para la recarga de
- 17. Java ConcurrentHashMap no es seguro ... ¿con wth?
- 18. cómo crear sincronizada ArrayList
- 19. Mezcla sincronizada() con ReentrantLock.lock()
- 20. WPF - animación sincronizada
- 21. anidada sincronizada palabra clave
- 22. Java Lista sincronizada
- 23. Pregunta sincronizada Java
- 24. ConcurrentHashMap y Hashtable en Java
- 25. Asignación de Hashmap a Hashmap
- 26. Hashmap vs Bundle en Android Comparación de eficacia y rendimiento
- 27. PHPExcel genera salida totalmente sincronizada
- 28. ¡la sección sincronizada no bloquea!
- 29. NullPointerException en la cuenta sincronizada
- 30. Java lista sincronizada de bucle
Entonces, ¿cuál es la diferencia entre 'Hashtable' y' Synchronized HashMap'? – roottraveller
Entre un ConcurrentHashMap y un HashMap sincronizado, ¿cuál recomienda? – Blunderchips