Maison >Java >javaDidacticiel >Analyse de la sécurité des threads de diverses collections en Java
Cet article présente principalement en détail la sécurité des threads de diverses collections Java. L'éditeur pense qu'il est plutôt bon, je le partage ici avec tout le monde pour référence par les amis qui en ont besoin.
Sécurité des threads
Tout d'abord, vous devez comprendre comment fonctionnent les threads. La JVM a une mémoire principale et chaque thread a son propre fonctionnement
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é des threads. . Une fois que chaque thread a obtenu ce verrou, il doit terminer le processus de chargement dans la mémoire de travail -> utiliser&assign -> pour libérer le verrou obtenu. 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.
Vector et ArrayList Leur utilisation est très similaire et peuvent être utilisés pour représenter un ensemble d'applications d'objets à nombre variable, et les éléments sont accessibles de manière aléatoire.
Les méthodes de Vector sont toutes synchronisées (Synchronized) et thread-safe (thread-safe), mais les méthodes d'ArrayList ne le sont pas puisque la synchronisation des threads affectera inévitablement les performances, par conséquent, les performances de. ArrayList Mieux que Vector.
Pour traiter une liste d'éléments de données, Java fournit deux classes, ArrayList et LinkedList L'implémentation interne. de ArrayList est basé sur un 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 un grande différence de performances entre eux.
D'après l'analyse ci-dessus, nous pouvons voir que lors de l'insertion de données devant ou au milieu d'ArrayList, vous devez reculer toutes les données suivantes en conséquence, ce qui prendra inévitablement plus de temps, donc lorsque vous L'opération consiste à ajouter des données après une colonne de données plutôt qu'au début ou au milieu, et lorsque vous devez accéder aux éléments de manière aléatoire, l'utilisation d'ArrayList offrira de meilleures performances
Et lors de l'accès à un certain élément dans la liste chaînée Lorsqu'il y a des éléments, vous devez commencer à partir d'une extrémité de la liste chaînée et rechercher é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 devant. au milieu d'une colonne de données, et lorsque vous accédez aux éléments dans l'ordre, vous devez utiliser LinkedList.
Si en programmation, deux situations 1 et 2 apparaissent alternativement, 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, la performance est garantie par le spécifique. mise en œuvre.
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 essentiellement synchronisées.
2), HashTable n'autorise pas les valeurs nulles.
Lors de l'appel de la méthode put dans le 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.
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.
1 HashMap utilise un tableau pour stocker l'objet Entry composé de clé et de valeur, sans limite de capacité.
2. HashMap trouve 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
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
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 la description de HashSet et TreeSet, TreeSet, comme HashSet, est entièrement basé sur 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). fournit également un certain support de tri a été ajouté. Par exemple, transmettez l'implémentation de Comparator, descendantingSet, descendantIterator, etc.
TreeMap :
1 TreeMap est une implémentation de carte typique basée sur des arbres rouge-noir, elle nécessite donc non plus une méthode de comparaison clé. passer dans l'implémentation Comparator, ou l'objet clé implémente l'interface Comparable.
2. TreeMap n'est pas thread-safe.
Résumé
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!