Quelle est la différence entre l'utilisation de la classe wrapper,, SynchronizedMap
sur un HashMap
et ConcurrentHashMap
?
Est-il simplement capable de modifier le HashMap
tout en l'itérant ( ConcurrentHashMap
)?
Synchronisé HashMap
:
Chaque méthode est synchronisée à l'aide d'un verrou au niveau de l'objet. Ainsi, les méthodes get et put de synchMap acquièrent un verrou.
Le verrouillage de la collection entière est une surcharge de performance. Pendant qu'un thread s'accroche au verrou, aucun autre thread ne peut utiliser la collection.
ConcurrentHashMap
a été introduit dans JDK 5.
Il n'y a pas de verrouillage au niveau de l'objet, le verrouillage est à une granularité beaucoup plus fine. Pour a ConcurrentHashMap
, les verrous peuvent être au niveau du seau de hashmap.
L'effet du verrouillage de niveau inférieur est que vous pouvez avoir des lecteurs et des enregistreurs simultanés, ce qui n'est pas possible pour les collections synchronisées. Cela conduit à beaucoup plus d'évolutivité.
ConcurrentHashMap
ne lance pas un ConcurrentModificationException
si un thread essaie de le modifier pendant qu'un autre l'itère.
Cet article Java 7: HashMap vs ConcurrentHashMap est une très bonne lecture. Hautement recommandé.
Hashtable
etSynchronized HashMap
?ConcurrentHashMap
lesize()
résultat pourrait être obsolète.size()
est autorisé à renvoyer une approximation au lieu d'un décompte exact selon le livre "Java Concurrency in Practice". Cette méthode doit donc être utilisée avec précaution.La réponse courte:
Les deux cartes sont des implémentations thread-safe de l'
Map
interface.ConcurrentHashMap
est implémenté pour un débit plus élevé dans les cas où une forte concurrence est attendue.L' article de Brian Goetz sur l'idée derrière
ConcurrentHashMap
est une très bonne lecture. Hautement recommandé.la source
Map m = Collections.synchronizedMap(new HashMap(...));
docs.oracle.com/javase/7/docs/api/java/util/HashMap.htmlConcurrentHashMap
est thread-safe sans synchroniser toute la carte. Les lectures peuvent se produire très rapidement tandis que l'écriture se fait avec un verrou.la source
Nous pouvons assurer la sécurité des threads en utilisant à la fois ConcurrentHashMap et synchronisedHashmap. Mais il y a beaucoup de différence si vous regardez leur architecture.
la source
Les deux sont une version synchronisée de HashMap, avec des différences dans leurs fonctionnalités de base et leur structure interne.
ConcurrentHashMap se compose de segments internes qui peuvent être considérés comme des HashMaps indépendants sur le plan conceptuel. Tous ces segments peuvent être verrouillés par des threads séparés dans des exécutions simultanées élevées. Ainsi, plusieurs threads peuvent obtenir / placer des paires clé-valeur à partir de ConcurrentHashMap sans se bloquer / attendre les uns les autres. Ceci est mis en œuvre pour un débit plus élevé.
tandis que
Collections.synchronizedMap () , nous obtenons une version synchronisée de HashMap et on y accède de manière bloquante. Cela signifie que si plusieurs threads tentent d'accéder à synchronizedMap en même temps, ils seront autorisés à obtenir / placer des paires clé-valeur une par une de manière synchronisée.
la source
ConcurrentHashMap
utilise un mécanisme de verrouillage plus fin connu sous le nomlock stripping
de permettre un plus grand degré d'accès partagé. Pour cette raison, il offre une meilleure concurrence et une meilleure évolutivité .De plus, les itérateurs renvoyés pour
ConcurrentHashMap
sont faiblement cohérents au lieu de la technique d' échec rapide utilisée par Synchronized HashMap.la source
Les méthodes en
SynchronizedMap
attente maintiennent le verrou sur l'objet, alorsConcurrentHashMap
qu'il existe un concept de "bande de verrouillage" où les verrous sont maintenus sur des seaux de contenu à la place. Amélioration de l'évolutivité et des performances.la source
ConcurrentHashMap:
1) Les deux maps sont des implémentations thread-safe de l'interface Map.
2) ConcurrentHashMap est implémenté pour un débit plus élevé dans les cas où une forte concurrence est attendue.
3) Il n'y a pas de verrouillage au niveau de l'objet.
Carte de hachage synchronisée:
1) Chaque méthode est synchronisée à l'aide d'un verrou de niveau objet.
la source
ConcurrentHashMap permet un accès simultané aux données. La carte entière est divisée en segments.
Lire l'opération ie.
get(Object key)
n'est pas synchronisé même au niveau du segment.Mais écrire des opérations ie.
remove(Object key), get(Object key)
acquérir le verrouillage au niveau du segment. Seule une partie de la carte entière est verrouillée, les autres threads peuvent toujours lire les valeurs de divers segments sauf celui verrouillé.SynchronizedMap , d'autre part, acquiert le verrouillage au niveau de l'objet. Tous les threads doivent attendre le thread actuel quelle que soit l'opération (lecture / écriture).
la source
Un test de performances simple pour ConcurrentHashMap vs Synchronized HashMap . Le flux de test appelle
put
un thread etget
trois threadsMap
simultanément. Comme @trshiv l'a dit, ConcurrentHashMap a un débit et une vitesse plus élevés pour les opérations de lecture sans verrouillage. Le résultat est que lorsque la durée des opérations est terminée10^7
, ConcurrentHashMap est2x
plus rapide que Synchronized HashMap.la source
SynchronizedMap
etConcurrentHashMap
sont tous deux de classe thread-safe et peuvent être utilisés dans une application multithread, la principale différence entre eux concerne la manière dont ils assurent la sécurité des threads.SynchronizedMap
acquiert le verrouillage sur toute l'instance de la carte, tandis que celle-ciConcurrentHashMap
divise l'instance de la carte en plusieurs segments et le verrouillage est effectué sur ceux-ci.la source
Selon java doc
la source