Quelle est la différence entre l'utilisation de la classe encapsulée, SynchronizedMap, sur HashMap et ConcurrentHashMap? Est-ce juste pouvoir modifier le hashmap tout en le répétant (ConcurrentHashMap)?
Réponses
Trop de publicités?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 simultanées des lecteurs et des auteurs whilch n'est pas possible pour la synchronisation de collections. Cela conduit à beaucoup plus d'évolutivité.
ConcurrentHashMap ne pas jeter un ConcurrentModificationException 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é.
La réponse courte:
Les deux cartes sont des implémentations thread-safe de l'interface Map. ConcurrentHashMap est implémenté pour un débit plus élevé dans les cas où une simultanéité élevée est attendue.
L' article de Brian Goetz sur l'idée de ConcurrentHashMap est une très bonne lecture. Hautement recommandé.
ConcurrentHashMap
utilise un mécanisme de verrouillage à grain fin appelé lock stripping
pour permettre un plus grand degré d'accès partagé. De ce fait, il offre une meilleure simultanéité et é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.