web-dev-qa-db-fra.com

ConcurrentHashMap et Hashtable dans Java

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?

60
sheidaei

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.

93
Lucas Holt

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)

  • Supposons que 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.

109
Premraj