Comment mettre en œuvre au mieux une carte de hachage simultanée en Java?



Cet article vous présentera un concept appelé Concurrent Hash Map en Java et le suivra avec une démonstration pratique

Cet article vous présentera un concept appelé Concurrent Hash Map In et suivez-le avec une démonstration pratique.Les conseils suivants seront abordés dans cet article,

Continuez avec cet article sur Concurrent Hash Map en Java





Comment ConcurrentHashMap fonctionne-t-il en interne?

À partir de Java 5, ConcurrentHashMap est présenté comme une alternative à HashTable. Nous pouvons également obtenir une carte synchronisée en utilisant la méthode de classe utilitaire appelée synchronizedMap () mais il y a un inconvénient de cette méthode à savoir des performances très médiocres car un seul thread peut y accéder à la fois. Donc ConcurrentHashMap résout ces problèmes.



Continuez avec cet article sur Concurrent Hash Map en Java

Pourquoi une autre carte?

Même si nous avons déjà HashMap, HashTable alors ce qui est un besoin de ConcurrentHashMap, c'est parce qu'il offre de meilleures performances en même temps qu'il est thread-safe.

créer une classe singleton en java

Continuez avec cet article sur Concurrent Hash Map en Java



En quoi est-ce différent?

Il est également basé sur le hachage mais ses performances sont améliorées par sa stratégie de verrouillage. Contrairement à HashTable ou Synchronized HashMap, il n'applique pas le même verrou sur chaque méthode, il utilise un verrou séparé pour chaque méthode, il utilise un verrou rentrant à cet effet. Semblable à HashMap, ConcurrentHashMap a 16 buckets, c'est-à-dire des segments, pour créer ConcurrentHashMap avec plus de 16 buckets, il a différents constructeurs.

Avant de parler en détail, passons en revue quelques concepts ci-dessous:

ConcurrentHashMap: cette carte permet l'accès aux threads simultanés. Seule une partie de la carte appelée segment, c'est-à-dire la structure de données sous-jacente, se verrouille lors de l'ajout ou de la mise à jour de la carte. Il permet un accès simultané aux threads pour lire les données sans verrouillage. Il a été introduit pour améliorer les performances.

  • Niveau de concurrence: c'est un nombre qui est une estimation du nombre de threads mis à jour simultanément.
  • Facteur de charge: C'est une valeur qui est utilisée pour contrôler le facteur de redimensionnement.
  • Capacité initiale: C'est une propriété qui crée une carte avec la taille fournie.

Voyons le diagramme ci-dessous et essayons de comprendre le fonctionnement de ConcurrentHashMap.

Image - Hashmap simultanée - Edureka

Ainsi, dans le diagramme ci-dessus, nous avons 16 verrous qui ne verrouillent qu'une partie de la carte, ce qui est nécessaire pour que d'autres méthodes soient accessibles par différents threads, améliorant ainsi les performances.

Semblable à HashMap, ConcurrentHashMap fonctionne de la même manière, il contient 16 segments par défaut et stocke l'élément par hachage, donc si les éléments ont le même hachage, ils sont stockés sur le même segment comme indiqué dans le diagramme ci-dessus à l'aide de la liste liée.

Continuez avec cet article sur Concurrent Hash Map en Java

Différence entre ConcurrentHashMap et HashMap

HashMap appartient aux collections tandis que ConcurrentHashMap appartient aux collections concurrentes, mais il existe de nombreuses autres différences entre elles.

  • ConcurrentHashMap estSans fil, c'est-à-diresynchronisé mais HashMap n'est pas synchronisé.
  • ConcurrentHashMap a des performances faibles car il est synchronisé car les threads doivent parfois attendre, mais HashMap est performant car il n'est pas synchronisé et tous les threads peuvent y accéder simultanément.
  • Nous obtiendrons ConcurrentModificationException si deux threads tentent simultanément de modifier ou d'ajouter le contenu d'Object. Cependant, dans le cas de ConcurrentHashMap, nous n'obtiendrons aucune exception lors de l'exécution de la même opération.

  • Les valeurs nulles sont autorisées pour la clé et les valeurs dans HashMap, cependant, ConcurrentHashMap n'autorise pas les valeurs nulles pour la clé et la valeur qu'il a essayé d'ajouter une valeur nulle, nous obtiendrons une exception, c'est-à-dire NullPointerException.

  • HashMap est introduit dans JDK 1.2 tandis que ConcurrentHashMap est introduit dans JDK 1.5.

Comme nous l'avons vu précédemment pour de meilleures performances, il se compose d'un tableau de nœuds sous forme de compartiments de table qui étaient des segments de table avant Java 8 .

obtenir la taille du tableau javascript

Les buckets sont initialisés paresseusement lors de la première insertion. Chaque compartiment peut être verrouillé indépendamment en verrouillant le premier nœud du compartiment et les opérations de lecture ne bloquent pas.

Par rapport à HashMap, ConcurrentHashMap fournit le supplément concurrencyLevel argument pour contrôler le nombre de threads estimé à utiliser.

Constructeurs:

  1. ConcurrentHashMap m = nouveau ConcurrentHashMap ()

    Une nouvelle carte vide est créée avec une capacité initiale par défaut de 16, un facteur de charge de 0,75 et un niveau de concurrence 16.

  2. ConcurrentHashMap m = new ConcurrentHashMap (int initialCapacity)
    Une nouvelle carte vide est créée avec une capacité initiale spécifiée, un facteur de charge de 0,75 et un niveau de concurrence 16.

  3. ConcurrentHashMap m = new ConcurrentHashMap (int initialCapacity, float loadFactor)

    Une nouvelle carte vide est créée avec une capacité initiale et un facteur de charge spécifiés avec un niveau de concurrence 16.

  4. ConcurrentHashMap m = new ConcurrentHashMap (int initialCapacity, float loadFactor, int concurrencyLevel)
    Une nouvelle carte vide est créée avec une capacité initiale, un facteur de charge et un niveau de concurrence spécifiés.

  5. ConcurrentHashMap m = nouveau ConcurrentHashMap (Map m)
    Crée un nouveau ConcurrentHashMap à partir de la carte fournie.

Les deux autres arguments: initialCapacity et loadFactor fonctionnaient à peu près de la même manière que HashMap.
ConcurrentMap est cohérent en mémoire sur les opérations clé / valeur dans un environnement multi-thread.

Continuez avec cet article sur Concurrent Hash Map en Java

tests de navigateurs croisés dans le sélénium

Pièges

Lors de la récupération d'objets, ConcurrentHashMap n'est pas bloqué et peut chevaucher des opérations de mise à jour. Par conséquent, pour de meilleures performances, ils ne récupèrent que les dernières opérations de mise à jour terminées.

Les résultats des méthodes d'état agrégé, notamment size, isEmpty et containsValue, ne sont généralement utiles que lorsqu'une carte ne fait pas l'objet de mises à jour simultanées dans d'autres threads.

Si les mises à jour simultanées sont correctement contrôlées, ces méthodes d'état peuvent être fiables.

Bien que ces méthodes ne garantissent pas en temps réel.

La capacité de table par défaut est de 16, mais nous pouvons la modifier en utilisant le niveau de concurrence.

public ConcurrentHashMap (int initialCapacity, float loadFactor, int concurrencyLevel) {// ... if (initialCapacity

Si les clés doivent être triées, nous pouvons utiliser ConcurrentSkipListMap.

Maintenant, après avoir exécuté le programme ci-dessus, vous auriez compris le Concurrent Hash Map en Java. Nous sommes donc arrivés à la fin de cet article sur Si vous souhaitez en savoir plus, consultez le , une entreprise d'apprentissage en ligne de confiance. Le cours de formation et de certification Java J2EE et SOA d'Edureka est conçu pour vous former aux concepts Java de base et avancés ainsi qu'à divers frameworks Java tels que Hibernate et Spring.

Vous avez une question pour nous? Veuillez le mentionner dans la section commentaires de cet article et nous vous répondrons dans les plus brefs délais.