Maison Java Javacommencer Compréhension approfondie de la sécurité des threads de diverses collections en Java

Compréhension approfondie de la sécurité des threads de diverses collections en Java

Nov 28, 2019 pm 05:45 PM
java 线程安全

Compréhension approfondie de la sécurité des threads de diverses collections en Java

Sécurité des threads

Tout d'abord, vous devez comprendre comment fonctionnent les threads JVM. chaque thread Il possède sa propre mémoire de travail

Quand un thread opère sur une variable, il doit créer une copie dans sa propre mémoire de travail

, puis écrire main

mémoire. Si plusieurs threads opèrent sur la même variable en même temps, des résultats imprévisibles peuvent se produire. Sur la base de l’explication ci-dessus, il est facile de proposer le scénario correspondant.

La clé de l'utilisation de synchronisé est de créer un moniteur. Ce moniteur peut être la variable à modifier ou d'autres objets que vous jugez appropriés, tels que des méthodes, puis verrouiller le moniteur pour assurer la sécurité de chaque thread. Après avoir acquis ce verrou, le processus de chargement dans la mémoire de travail -> use&assign -> sera exécuté avant que le verrou acquis ne soit libéré. Cela permet d'obtenir ce qu'on appelle la sécurité des threads.

Qu'est-ce que la sécurité des threads ? Comment la sécurité des threads est-elle assurée (principe) ? La sécurité des threads signifie que plusieurs threads accèdent au même code sans produire de résultats incertains. L’écriture de code thread-safe nécessite peu de synchronisation des threads.

[Apprentissage recommandé :

Tutoriel vidéo Java]

Collection liée à Java

Vector, ArrayList, LinkedList

Vector et ArrayList sont très similaires dans leur utilisation. Ils peuvent tous deux être utilisés pour représenter un ensemble d'un nombre variable d'objets, et les éléments sont accessibles de manière aléatoire.

Les méthodes de Vector sont toutes synchronisées (synchronisées) et thread-safe, mais les méthodes d'ArrayList ne le sont pas. Étant donné que la synchronisation des threads affectera inévitablement les performances, les performances d'ArrayList sont meilleures que celles de Vector.

La différence entre ArrayList et LinkedList

Pour traiter une colonne d'éléments de données, Java fournit deux classes, ArrayList et LinkedList. L'implémentation interne d'ArrayList est basée sur la. tableau interne Object[], Donc conceptuellement, cela ressemble plus à un tableau, mais l'implémentation interne de LinkedList est basée sur un ensemble d'enregistrements connectés, donc cela ressemble plus à une structure de liste chaînée, donc il y a une grande différence de performances.

D'après l'analyse ci-dessus, lors de l'insertion de données devant ou au milieu d'ArrayList, vous devez déplacer toutes les données suivantes en arrière en conséquence, ce qui prendra inévitablement plus de temps. Par conséquent, lorsque votre opération est lors de l'ajout de données après. une colonne de données plutôt qu'au début ou au milieu, et vous devez accéder aux éléments de manière aléatoire, utiliser ArrayList offrira de meilleures performances

Et lorsque vous accédez à un élément de la liste chaînée, vous devez commencer à partir d'une extrémité de la liste chaînée et recherchez élément par élément dans le sens de la connexion jusqu'à ce que vous trouviez l'élément requis. Par conséquent, lorsque votre opération consiste à ajouter ou à supprimer des données devant ou au milieu d'une colonne de données, et à accéder aux éléments dans l'ordre Quand, vous devez utiliser LinkedList.

Si les situations 1 et 2 apparaissent alternativement dans la programmation, alors vous pouvez envisager d'utiliser une interface générale comme List sans vous soucier de l'implémentation spécifique. Dans des situations spécifiques, ses performances sont déterminées par une implémentation spécifique à garantir.

HashTable, HashMap, HashSet

HashTable et HashMap utilisent le même mécanisme de stockage, et leur implémentation est fondamentalement la même. La différence est :

1 ), HashMap n'est pas thread-safe, HashTable est thread-safe et les méthodes internes sont fondamentalement synchronisées.

2), HashTable n'autorise pas les valeurs nulles.

Lors de l'appel de la méthode put dans HashTable, si la clé est nulle, une NullPointerException sera levée directement. Il existe d'autres différences subtiles, telles que la taille du tableau Entry initialisé, etc., mais l'idée de base est la même que celle de HashMap.

HashSet :

1. HashSet est implémenté sur la base de HashMap et n'a aucune limite de capacité.

2. HashSet n’est pas thread-safe.

3. HashSet ne garantit pas la commande.

HashMap :

1 HashMap utilise un tableau pour stocker l'objet Entry composé de clé et de valeur, sans limite de capacité.

2. HashMap recherche l'emplacement où l'objet Entry est stocké dans le tableau en fonction du hachage de clé et utilise une liste chaînée pour résoudre les conflits de hachage.

3. HashMap peut avoir besoin d'étendre la capacité du tableau lors de l'insertion d'éléments. Lors de l'extension de la capacité, le hachage doit être recalculé et l'objet copié dans un nouveau tableau.

4. HashMap n'est pas thread-safe.

5. La traversée HashMap utilise Iterator

HashTable

1.

2. Ni la clé ni la valeur dans HashTable ne peuvent être nulles.

3. La traversée HashTable utilise l'énumération.

TreeSet,TreeMap

TreeSet :

1. TreeSet est implémenté sur la base de TreeMap et prend en charge le tri.

2. TreeSet n'est pas thread-safe.

À en juger par les descriptions de HashSet et TreeSet, TreeSet, comme HashSet, est entièrement implémenté sur la base de Map, et aucun des deux ne prend en charge get(int) pour obtenir l'élément à la position spécifiée (il faut traverser pour obtenir). TreeSet fournit également un support de tri qui a été ajouté. Par exemple, transmettez l'implémentation de Comparator, descendantingSet, descendantIterator, etc.

TreeMap :

1. TreeMap est une implémentation de Map typique basée sur des arbres rouge-noir, elle nécessite donc une méthode de comparaison de clés ou sa transmission dans une implémentation de comparateur. , ou l'objet clé implémente l'interface Comparable.

2. TreeMap n'est pas thread-safe.

Résumé

Ce qui précède est l'intégralité du contenu de cet article sur l'explication détaillée de la sécurité des threads de diverses collections Java. J'espère qu'il sera utile à tout le monde.

Cet article provient de la rubrique Introduction Java, bienvenue pour apprendre !

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!

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Racine carrée en Java Racine carrée en Java Aug 30, 2024 pm 04:26 PM

Guide de la racine carrée en Java. Nous discutons ici du fonctionnement de Square Root en Java avec un exemple et son implémentation de code respectivement.

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Générateur de nombres aléatoires en Java Générateur de nombres aléatoires en Java Aug 30, 2024 pm 04:27 PM

Guide du générateur de nombres aléatoires en Java. Nous discutons ici des fonctions en Java avec des exemples et de deux générateurs différents avec d'autres exemples.

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Horodatage à ce jour en Java Horodatage à ce jour en Java Aug 30, 2024 pm 04:28 PM

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

See all articles