Maison > Java > javaDidacticiel > Conteneurs simultanés en Java

Conteneurs simultanés en Java

王林
Libérer: 2023-06-08 09:54:27
original
1291 Les gens l'ont consulté

Avec la popularité des processeurs multicœurs, les programmeurs ont commencé à s'intéresser au problème de l'accès simultané aux données. Afin de résoudre le problème de la sécurité des threads, Java fournit une variété de conteneurs simultanés. Cet article présentera plusieurs conteneurs simultanés Java courants.

  1. ConcurrentHashMap

ConcurrentHashMap est une table de hachage thread-safe. Il s'agit fondamentalement de la même implémentation que HashMap, mais ConcurrentHashMap prend en charge les opérations de modification à haute concurrence, il est donc plus adapté aux scénarios multithread que HashMap.

ConcurrentHashMap contient plusieurs verrous de segment, chaque verrou protège un compartiment de hachage, de sorte que plusieurs threads puissent modifier différents compartiments simultanément. Cette conception permet à ConcurrentHashMap d'obtenir une séparation efficace en lecture et en écriture.

Les étapes pour utiliser ConcurrentHashMap sont les suivantes :

  1. Créer une instance ConcurrentHashMap :
ConcurrentMap<Integer, String> map = new ConcurrentHashMap<>();
Copier après la connexion
    #🎜🎜 #Ajouter des éléments :
  1. map.put(1, "one");
    Copier après la connexion
    Copier après la connexion
    Obtenir un élément : # #🎜 🎜# CopyOnWriteArrayList est un tableau dynamique thread-safe. Sa caractéristique est que l'opération d'écriture ne modifie pas directement le tableau d'origine, mais crée un nouveau tableau à modifier, puis remplace le tableau d'origine par le nouveau tableau. Étant donné que les opérations de modification et les opérations de lecture n'entrent pas en conflit, CopyOnWriteArrayList prend en charge un nombre élevé d'opérations de lecture simultanées. # 🎜🎜 ## 🎜🎜 # Les étapes pour utiliser CopyOnwriteArrayList sont les suivantes: # 🎜🎜 ## 🎜🎜 ## 🎜🎜 # Création d'une instance CopyOnwriteArrayList: # 🎜🎜 ## 🎜🎜 #
    String value = map.get(1);
    Copier après la connexion
    # 🎜🎜 ## 🎜🎜 🎜🎜 #Ajouter des éléments :
  1. List<String> list = new CopyOnWriteArrayList<>();
    Copier après la connexion
    Obtenir des éléments :
  1. list.add("one");
    Copier après la connexion
Il est à noter que puisque chaque modification nécessite la création d'un nouveau tableau, CopyOnWriteArrayList Les opérations de modification sont lentes et ne conviennent pas aux opérations d'écriture à haute fréquence.

ConcurrentLinkedQueue

  1. ConcurrentLinkedQueue est une file d'attente thread-safe. Sa mise en œuvre est basée sur des listes chaînées et prend en charge les opérations de mise en file d'attente et de sortie de file d'attente à haute concurrence.
ConcurrentLinkedQueue utilise en interne les opérations CAS pour implémenter des modifications simultanées à la liste chaînée, évitant ainsi les problèmes de performances causés par l'utilisation de verrous.
  1. Les étapes pour utiliser ConcurrentLinkedQueue sont les suivantes :
    Créer une instance ConcurrentLinkedQueue :
  1. String value = list.get(0);
    Copier après la connexion
#🎜🎜 #Opération d'entrée :

Queue<String> queue = new ConcurrentLinkedQueue<>();
Copier après la connexion
  1. Opération de sortie de file d'attente :
queue.offer("one");
Copier après la connexion

Il est à noter que ConcurrentLinkedQueue ne prend pas en charge l'accès aléatoire, donc il ne peut commencer le parcours qu'à partir de la tête de la file d'attente.

ConcurrentSkipListMap

    ConcurrentSkipListMap est une table de mappage ordonnée thread-safe. Son implémentation est basée sur des tables de saut et peut prendre en charge rapidement les opérations d'insertion, de suppression et de recherche.
  1. Semblable à ConcurrentHashMap, ConcurrentSkipListMap est également divisé en plusieurs niveaux. Chaque niveau possède son propre ensemble de listes chaînées, ce qui peut améliorer l'efficacité de l'accès simultané.
    Les étapes pour utiliser ConcurrentSkipListMap sont les suivantes :
Créer une instance ConcurrentSkipListMap :
  1. String value = queue.poll();
    Copier après la connexion
  2. #🎜 🎜 #Ajouter des éléments :

ConcurrentNavigableMap<Integer, String> map = new ConcurrentSkipListMap<>();
Copier après la connexion

    Obtenir des éléments :
  1. map.put(1, "one");
    Copier après la connexion
    Copier après la connexion
    Il est à noter que la mise en œuvre de ConcurrentSkipListMap est relativement complexe, donc dans de petits volumes de données. Dans certains cas, les performances peuvent être pires que TreeMap.

    Summary

    Java fournit une variété de conteneurs simultanés, et les programmeurs peuvent choisir le conteneur approprié en fonction de leurs besoins. Il convient de noter que différents conteneurs ont différents scénarios applicables et qu'une mauvaise utilisation peut entraîner des problèmes de performances. Il est donc recommandé de choisir le conteneur approprié en fonction du scénario.

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal