Quelle est la différence entre un ConcurrentHashMap et un Hashtable en Java?
Qu'est-ce qui est plus efficace pour les applications threadées?
ConcurrentHashMap
utilise plusieurs compartiments pour stocker les données. Cela évite les verrous de lecture et améliore considérablement les performances par rapport à HashTable
. Les deux sont thread-safe, mais il y a des gains de performance évidents avec ConcurrentHashMap
.
Lorsque vous lisez à partir d'un ConcurrentHashMap
à l'aide de get()
, il n'y a pas de verrous, contrairement à HashTable
pour lequel toutes les opérations sont simplement synchronisées. HashTable
a été publié dans les anciennes versions de Java alors que ConcurrentHashMap
est un élément Java 5+.
HashMap
est la meilleure chose à utiliser dans une application à un seul thread.
Mécanisme de verrouillage ConcurrentHashMap et Hashtable
Hashtable
appartient au framework Collection; ConcurrentHashMap
appartient au framework Executor.Hashtable
utilise un verrou unique pour l'ensemble des données. ConcurrentHashMap
utilise plusieurs verrous au niveau du segment (16 par défaut) au lieu du niveau objet c’est-à-dire l’ensemble Map
.ConcurrentHashMap
le verrouillage est appliqué uniquement pour les mises à jour. En cas d'extraction, cela permet une concurrence simultanée totale. L'extraction reflète les résultats des opérations de mise à jour les plus récentes. Les lectures peuvent donc être très rapides, alors que les écritures sont effectuées avec un verrou.ConcurrentHashMap
ne jette pas un ConcurrentModificationException
si un thread tente de le modifier pendant qu'un autre le parcourt et n'autorise pas les valeurs NULL.ConcurrentHashMap
retourne Iterator
, qui est protégé contre la défaillance (l’itérateur effectuera une copie de la structure de données interne) lors d’une modification simultanée.ConcurrentHashMap
utilise une logique de fragments de base de données (Segment<K, V>[] segments
) est appelé niveau concurrentiel , c’est-à-dire qu'il divise les données en fragments (segments) puis que des verrous sur chaque fragment (segment) au lieu de verrou unique pour l'ensemble des données (Map
). La valeur par défaut est 16.Pour comprendre techniquement ConcurrentHashMap, veuillez regarder ceci lien
L'analogie suivante vous aide à comprendre le concept uniquement (pas de logique)
Hashtable
et ConcurrentHashMap
sont deux types de maisons.Hashtable
verrouille la porte principale de la maison.ConcurrentHashMap
verrouille une porte spécifique à la place de la porte principale.Qu'est-ce qui est plus efficace pour les applications threadées?
ConcurrentHashMap
est plus efficace pour les applications threadées.