ConcurrentHashMap vs Synchronisé HashMap
Quelle est la différence entre l'utilisation de la classe wrapper, SynchronizedMap
, sur un HashMap
et ConcurrentHashMap
?
Est-il juste d'être capable de modifier le HashMap
lors de l'itération, il (ConcurrentHashMap
)?
Vous devez vous connecter pour publier un commentaire.
Synchronisé
HashMap
:Chaque méthode est synchronisé à l'aide d'un objet de niveau de verrouillage. Afin de l'obtenir et de mettre des méthodes sur synchMap acquérir un verrou.
Le verrouillage de l'ensemble de la collection est une surcharge de performance. Alors qu'un thread détient sur la serrure, aucun autre thread ne peut utiliser la collection.
ConcurrentHashMap
a été introduit dans le JDK 5.Il n'y a pas de blocage au niveau de l'objet,Le verrouillage est beaucoup plus fine granularité. Pour un
ConcurrentHashMap
, les verrous peuvent être à une table de hachage seau niveau.L'effet de la baisse de niveau de verrouillage est que vous pouvez avoir de lecteurs simultanés et les écrivains qui n'est pas possible pour la synchronisation de collections. Cela conduit à beaucoup plus d'évolutivité.
ConcurrentHashMap
ne pas jeter unConcurrentModificationException
si un thread tente de modifier tandis que l'autre est une itération sur elle.Cet article Java 7: HashMap vs ConcurrentHashMap est une très bonne lecture. Fortement recommandé.
Hashtable
etSynchronized HashMap
?ConcurrentHashMap
'ssize()
résultat pourrait être hors de date.size()
est autorisé à revenir à un rapprochement au lieu d'un compte exact selon "Java Simultanéité dans la Pratique" livre. Donc, cette méthode doit être utilisée avec précaution.La réponse courte:
Les deux cartes sont thread-safe, les implémentations de la
Map
interface.ConcurrentHashMap
est mis en œuvre pour des débits plus élevés dans les cas où une haute simultanéité est prévu.Brian Goetz est l'article sur l'idée derrière
ConcurrentHashMap
est une très bonne lecture. Fortement recommandé.Map m = Collections.synchronizedMap(new HashMap(...));
docs.oracle.com/javase/7/docs/api/java/util/HashMap.htmlConcurrentHashMap
est thread-safe, sans synchronisation de l'ensemble de la carte. Lit peuvent arriver très vite alors que l'écriture est réalisée avec une serrure.Nous pouvons parvenir à 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.
Les deux sont synchronisés version de la table de hachage, avec la différence dans leurs fonctionnalités de base et sa structure interne.
ConcurrentHashMap consistent en interne des segments qui peut être considéré comme indépendant HashMaps sur le plan Conceptuel.
Tous ces segments peuvent être verrouillées par des threads séparés en haute exécutions simultanées.
Ainsi, plusieurs threads peuvent obtenir/mettre des paires clé-valeur de ConcurrentHashMap sans blocage/attendre les uns les autres.
Ceci est mis en œuvre pour augmenter le débit.
alors que
Collections.synchronizedMap(), nous obtenons une version synchronisée de la table de hachage et il est accessible dans le blocage de la manière. Cela signifie que si plusieurs threads tentent d'accéder synchronizedMap en même temps, ils seront autorisés à obtenir/mettre des paires clé-valeur, un à la fois de façon synchronisée.
ConcurrentHashMap
utilise finement mécanisme de verrouillage connu commelock stripping
pour permettre un plus grand degré de l'accès partagé. En raison de cela, il fournit une meilleure simultanéité et évolutivité.Également les itérateurs retourné pour
ConcurrentHashMap
sont faiblement cohérente au lieu de échec technique rapide utilisé par Synchronisé HashMap.Méthodes sur
SynchronizedMap
maintenez le verrou sur l'objet, alors que dansConcurrentHashMap
il y a un concept de "verrouillage de l'entrelacement", où les verrous sont détenus sur des seaux de le contenu à la place. Donc à l'amélioration de l'évolutivité et les performances.ConcurrentHashMap :
1)les Deux cartes sont thread-safe implémentations de l'interface de la Carte.
2)ConcurrentHashMap est mis en œuvre pour des débits plus élevés dans les cas où une haute simultanéité est prévu.
3) Il n'y a pas de blocage au niveau de l'objet.
Synchronisé De Hachage Carte:
1) Chaque méthode est synchronisé à l'aide d'un objet de niveau de verrouillage.
Un simple test de performance pour ConcurrentHashMap vs Synchronisé HashMap
. Le test de débit appelle
put
dans un thread et de l'appel deget
dans trois threads surMap
simultanément. Comme @trshiv dit, ConcurrentHashMap a un débit plus élevé et la vitesse dont la lecture exploitation sans verrouillage. Le résultat est quand les durées de fonctionnement est plus10^7
, ConcurrentHashMap est2x
plus vite que Synchronisés HashMap.ConcurrentHashMap permet un accès simultané aux données. Toute la carte est divisée en segments.
Opération de lecture ie.
get(Object key)
n'est pas synchronisé, même au niveau du segment.Mais les opérations d'écriture ie.
remove(Object key), get(Object key)
acquérir verrouillage au niveau du segment. Une partie seulement de l'ensemble de la carte est verrouillée, les autres threads ne peut toujours lire des valeurs de différents secteurs, à l'exception bloqué.SynchronizedMap d'autre part, d'acquérir de verrouillage au niveau de l'objet. Tous les fils doivent attendre que le thread en cours, indépendamment de l'opération(Lecture/Écriture).
Comme par java doc de