Le thread de hachage est-il sécurisé ?
Qu'est-ce que la sécurité des threads ? Cela signifie que la lecture et l'écriture des données doivent être isolées des threads, ce qui ne doit pas entraîner de perte de données ou d'incohérence. Chaque fois que les données sont modifiées, elles ne doivent pas être écrasées.
Prenons l'exemple classique d'un retrait bancaire. Le compte A lit initialement 0, le thread A lit 0, puis enregistre 100 (aucune donnée n'a encore été écrite) et enregistre également 100. temps Le dernier compte que nous voyons est un solde de 100. Ceci n’est pas scientifique et est appelé thread dangereux. Par conséquent, nous devons contrôler les objets pour les dépôts et les retraits et laisser les objets que nous exploitons verrouiller les données après la mise à jour des données, d'autres threads peuvent assurer la sécurité des threads.
Cette fois, nous prouverons HashSet Nous savons que l'interface Set est implémentée. La caractéristique de Set est que les données stockées ne seront pas répétées. Parce qu'il lira d'abord les données enregistrées en interne pour voir si elles existent, elles n'y seront pas stockées, sinon elles y seront stockées. En d’autres termes, l’opération de stockage des données est divisée en deux étapes : d’abord la lecture, puis l’écriture. En supposant qu'il n'est pas thread-safe, une situation très probable est que lorsque le thread A détermine que l'objet défini n'a pas d'élément et est sur le point d'insérer l'élément, le thread B détermine également que l'objet n'a pas l'élément et est sur le point d'insérer l'élément. se prépare également à l'insérer. Finalement, le résultat est que deux éléments identiques sont insérés.
Nous concevons la démo comme ceci :
class TestHashSet implements Runnable{ // 实现Runnable 让该集合能被多个线程访问 Set<Integer> set = new HashSet<Integer>(); // 线程的执行就是插入5000个整数 @Override public void run() { for (int i = 0;i < 5000;i ++) { set.add(i); } } }
Nous la testons sur le fil principal :
TestHashSet run2 = new TestHashSet(); // 实例化两个线程 Thread t6 = new Thread(run2); Thread t7 = new Thread(run2); // 启动两个线程 t6.start(); t7.start(); // 当前线程等待加入到调用线程后 t6.join(); t7.join(); // 打印出集合的size System.out.println(run2.set.size());
La plupart des résultats imprimés sont les 5000 attendus, mais ils apparaissent parfois. La situation est supérieure à 5000. Cela conduit à la situation mentionnée précédemment, qui prouve que HashSet n'est pas une classe thread-safe.
En fait, en regardant le code source, j'ai découvert que HashMap est utilisé pour conserver les données en interne dans HashSet. La raison fondamentale est que HashMap n'est pas une classe thread-safe. Cela conduit à la sécurité non-thread de HashSet. Pour plus de connaissances sur les classes de collection Java, veuillez prêter attention à [Site Web PHP chinois : vidéo Java]
Enfin, une vérification complète de la casse du code :
import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; /** * 验证HashSet不是线程安全 */ public class HashSetTest { public static void main(String[] args) { final Set<Integer> set = new HashSet<>();// 结果可能大于1000 // final Set<Integer> set = Collections.synchronizedSet(new HashSet<>());// 结果等于1000 // final Set<Integer> set = Collections.newSetFromMap(new ConcurrentHashMap<Integer, Boolean>());// 结果等于1000 // 往set写入1-1000 Runnable runnable = new Runnable() { @Override public void run() { for (int i = 1; i <= 1000; i++) { set.add(i); } } }; int threadNum = 10;// 线程数 List<Thread> threadList = new ArrayList<>(); for (int i = 0; i < threadNum; i++) { Thread thread = new Thread(runnable); threadList.add(thread); thread.start(); } // 主线程等待子线程执行完成 for (Thread thread : threadList) { try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(set.size());// 结果可能大于1000 } }
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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

Sujets chauds





Utilisez la méthode HashSet.remove() en Java pour supprimer les éléments spécifiés d'une collection. HashSet est une classe de collection qui implémente l'interface Set. Elle ne permet pas le stockage d'éléments en double et ne garantit pas l'ordre des éléments. Lorsque vous utilisez un HashSet, vous pouvez utiliser la méthode remove() pour supprimer des éléments de l'ensemble. La méthode remove() de HashSet a deux formes surchargées : booleanremove(Objectobj) : supprime l'objet spécifié de la collection

La fonction HashSet en Java est une classe de collection implémentée sur la base d'une table de hachage. Puisqu'il s'agit d'une classe de collection, elle a naturellement la fonction d'opérations de collection. Cet article explique comment utiliser la fonction HashSet pour effectuer des opérations de collection. 1. Définition et déclaration de HashSet HashSet est une classe de collection, vous devez donc d'abord importer le package Java.util. importjava.util.HashSet Vous pouvez ensuite créer une instance HashSet : HashSet<

Interprétation de la documentation Java : Explication détaillée de l'utilisation de la méthode contain() de la classe HashSet. La classe HashSet est l'une des classes de collection couramment utilisées en Java. Elle implémente l'interface Set et est basée sur la structure de données de la table de hachage. avec des opérations efficaces d’insertion, de suppression et de recherche. Parmi elles, la méthode contain() est une méthode importante fournie par la classe HashSet, qui est utilisée pour déterminer si l'ensemble contient l'élément spécifié. Cet article analysera en détail l'utilisation de la méthode contain() de la classe HashSet, et

Utilisez la méthode addAll() de la classe HashSet pour ajouter tous les éléments d'une collection à une autre collection. HashSet est une classe d'implémentation dans le framework de collection Java. Elle hérite de AbstractSet et implémente l'interface Set. HashSet est un ensemble non ordonné basé sur une table de hachage, qui n'autorise pas les éléments en double. Il fournit de nombreuses méthodes couramment utilisées pour faire fonctionner les éléments de la collection, dont la méthode addAll(). La fonction de la méthode addAll() est d'ajouter le spécifié

Il est très simple d'ajouter des éléments à une collection à l'aide de la méthode HashSet.add() en Java. Présentons-la en détail ci-dessous. HashSet est une classe de collection en Java. Elle hérite de la classe AbstractSet et implémente l'interface Set. Elle se caractérise par être non ordonnée et non répétitive, et l'implémentation sous-jacente est basée sur une table de hachage. Lorsque vous utilisez la méthode HashSet.add() pour ajouter des éléments, vous devez faire attention aux points suivants : HashSet ne peut stocker que des éléments de type objet, pas

Utilisez la méthode addAll() de la classe HashSet pour ajouter un ensemble à un autre ensemble. HashSet est une classe de collection en Java. Elle implémente l'interface Set et est implémentée sur la base d'une table de hachage. Les éléments en double ne sont pas autorisés dans la collection HashSet et les éléments de la collection ne sont pas ordonnés. En développement, nous devons souvent ajouter des éléments d’une collection à une autre collection. La classe HashSet fournit la méthode addAll() pour implémenter facilement cette fonction. Ci-dessous, nous passerons par un

Interprétation de la documentation Java : Explication détaillée de l'utilisation de la méthode iterator() de la classe HashSet. Des exemples de code spécifiques sont nécessaires. En programmation Java, HashSet est l'une des classes de collection couramment utilisées. Elle implémente l'interface Set et hérite de la. Classe AbstractSet. La méthode iterator() de la classe HashSet est utilisée pour renvoyer un objet itérateur pour parcourir les éléments du HashSet. Cet article expliquera en détail l'utilisation de la méthode iterator() de la classe HashSet, et

Diagramme de classes HashSet Brève description de HashSet 1. HashSet implémente l'interface Set 2. La couche inférieure de HashSet est en fait implémentée par HashMap publicHashSet(){map=newHashMap();} 3. Null peut être stocké, mais il ne peut y en avoir qu'un seul. 4.HashSet ne garantit pas que les éléments sont dans l'ordre (c'est-à-dire qu'il ne garantit pas que l'ordre dans lequel les éléments sont stockés est cohérent avec l'ordre dans lequel les éléments sont extraits. Le résultat de l'index est déterminé). après le hachage.5.Il ne peut pas y avoir d'éléments en double.Le mécanisme sous-jacent de HashSet explique que la couche inférieure de HashSet est HashMap et que la couche inférieure de HashMap est HashMap.C'est la structure d'un tableau + une liste chaînée + une simulation d'arbre rouge-noir. tableau + liste chaînée /*