2012-09-28 16 views
41

¿Cuál es la diferencia entre un ConcurrentHashMap y un Hashtable en Java?ConcurrentHashMap y Hashtable en Java

¿Cuál es más eficiente para aplicaciones con rosca?

+0

Puede ser esto ayuda http://www.codercorp.com/blog/java/why-concurrenthashmap-is-better-than-hashtable-and-just-as-good-hashmap.html – kosa

+2

Para un no roscado aplicación, use 'HashMap'. –

+0

También vea http://stackoverflow.com/a/40878/632951 para más información. – Pacerier

Respuesta

68

ConcurrentHashMap utiliza varios depósitos para almacenar datos. Esto evita bloqueos de lectura y mejora enormemente el rendimiento en un HashTable. Ambos son seguros para subprocesos, pero hay ganancias obvias de rendimiento con ConcurrentHashMap.

Cuando lee desde ConcurrentHashMap usando get(), no hay bloqueos, al contrario de HashTable para el que todas las operaciones están simplemente sincronizadas. HashTable se lanzó en las versiones anteriores de Java, mientras que ConcurrentHashMap es una cosa de Java 5+.

HashMap es lo mejor para usar en una sola aplicación con hilos.

+10

También hay 'ConcurrentHashMap.putIfAbsent()' que no tiene un equivalente en el antiguo ' Hashtable'. Y cuando solo lee de un 'ConcurrentHashMap', no hay bloqueos, al contrario de' Hashtable', para el cual todas las operaciones simplemente se sincronizan. –

+0

@FrankPavageau agregó sus comentarios muy útiles en la respuesta original. – Algorithmist

53

ConcurrentHashMap y Hashtable mecanismo de bloqueo

  • Hashtable es pertenece a la infraestructura de recogida; ConcurrentHashMap pertenece al marco Ejecutor.
  • Hashtable utiliza cerradura simple para datos enteros. ConcurrentHashMap usa bloqueos múltiples en el nivel de segmento (16 de forma predeterminada) en lugar del nivel de objeto, es decir, Map completo.
  • ConcurrentHashMap bloqueo se aplica solo para las actualizaciones. En el caso de las recuperaciones, permite concurrencia total, las recuperaciones reflejan los resultados de las operaciones de actualización completadas más recientemente. Entonces, las lecturas pueden suceder muy rápido mientras las escrituras se realizan con un bloqueo.
  • ConcurrentHashMap no arroja un ConcurrentModificationException si un hilo intenta modificarlo mientras otro itera sobre él y no permite valores nulos.
  • ConcurrentHashMap devuelve Iterator, que falla-seguro (es decir, el iterador hará una copia de la estructura de datos interna) en la modificación simultánea.
  • ConcurrentHashMap utiliza una lógica fragmentos de bases de datos (Segment<K, V>[] segments) se conoce como concurrencia-Nivel, es decir, divide los datos en fragmentos (segmentos) que pone cerraduras de cada fragmento (segmento) en lugar de poner un candado para datos enteros (Map) El valor por defecto es 16.

Comprender la ConcurrentHashMap más técnicamente favor mira este link

la siguiente analogía ayuda a conseguir entender el concepto (no lógica)

  • Asumir Hashtable y ConcurrentHashMap son dos tipos de casas.
  • Hashtable bloquea la puerta principal del hogar.
  • ConcurrentHashMap bloquea la puerta de la habitación específica en lugar de la puerta principal.

¿Cuál es más eficiente para las aplicaciones con rosca?

ConcurrentHashMap es más eficiente para aplicaciones con rosca.

+0

Gran respuesta + Peter – prayagupd

+0

Muy bien explicado – RamBen

+2

Ejemplo de casa ganó toda la teoría :) –

Cuestiones relacionadas