Maison Problème commun Le thread de hachage est-il sécurisé ?

Le thread de hachage est-il sécurisé ?

Apr 25, 2019 pm 01:38 PM
hashset

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.

Le thread de hachage est-il sécurisé ?

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);
        }
    }
}
Copier après la connexion

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());
Copier après la connexion

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
    }
}
Copier après la connexion

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

Video Face Swap

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 !

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)

Comment utiliser la méthode HashSet.remove() en Java pour supprimer des éléments d'une collection ? Comment utiliser la méthode HashSet.remove() en Java pour supprimer des éléments d'une collection ? Nov 18, 2023 pm 02:17 PM

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

Comment utiliser la fonction HashSet pour les opérations définies en Java Comment utiliser la fonction HashSet pour les opérations définies en Java Jun 26, 2023 pm 05:15 PM

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&lt;

Interprétation de la documentation Java : Explication détaillée de l'utilisation de la méthode contain() de la classe HashSet Interprétation de la documentation Java : Explication détaillée de l'utilisation de la méthode contain() de la classe HashSet Nov 04, 2023 am 11:43 AM

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

Ajoutez tous les éléments d'une collection à une autre en utilisant la méthode addAll() de la classe HashSet Ajoutez tous les éléments d'une collection à une autre en utilisant la méthode addAll() de la classe HashSet Jul 24, 2023 am 08:58 AM

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é

Comment utiliser la méthode HashSet.add() pour ajouter des éléments à une collection en Java ? Comment utiliser la méthode HashSet.add() pour ajouter des éléments à une collection en Java ? Nov 18, 2023 pm 04:56 PM

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

Ajouter une collection à une autre collection en utilisant la méthode addAll() de la classe HashSet Ajouter une collection à une autre collection en utilisant la méthode addAll() de la classe HashSet Jul 25, 2023 pm 05:00 PM

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 Interprétation de la documentation Java : Explication détaillée de l'utilisation de la méthode iterator() de la classe HashSet Nov 03, 2023 am 09:44 AM

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

Comment ajouter des éléments de traversée à Java HashSet Comment ajouter des éléments de traversée à Java HashSet Apr 28, 2023 pm 01:04 PM

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 /*