JUC Concurrency Series(5):CopyOnWriteArraySetはHashSetの非スレッドセーフを解決します(コード例)

プログラムを実行することは難しくありません;難しいのはプログラムがどこまで実行できるかです!-激しい種子

ここに画像の説明を挿入
JUC同時実行シリーズ

JUC同時実行シリーズ(1):何ですか?並行性と並列
JUC並行性シリーズ(2)を混同していると聞きました
。JUC並行性シリーズを起動するための正確な通知を達成するための条件の詳細な説明(3):インタビューの並行性、およびロックは最初の質問で気絶します(怒っている肝臓の記事はロックを完全に理解しており、インタビューはパニックではありません) )
JUC並行処理シリーズ(4):[インタビューのよくある質問] ArrayListの非スレッドセーフを解決するさまざまな方法、CopyOnWriteArrayListの詳細説明

1つは、HashSetはスレッドセーフではない

CopyOnWriteArrayListとArrayListに関する以前の記事を読んだ友達は、スレッドセーフではないので、これは実際には非常によく似ています。加えて、ArrayListのとHashSetのは、かつては異なるされているのでArrayListを注文し、繰り返し可能であり、後者HashSetのリピート外無秩序ではなく、、ArrayListのとHashSetのは、私たちの次の今後のスピーキングを含め、非スレッドセーフであるのHashMapも非ありますスレッドセーフ(マルチスレッドの同時実行性が関係しない場合、最も一般的に使用され、パフォーマンスが向上します)

JUC同時実行シリーズ(4):[インタビューのよくある質問] ArrayListの非スレッドセーフを解決するさまざまな方法、CopyOnWriteArrayListを詳細に説明

1.1 HashSetの非スレッドセーフなコード例

public class Demo {
    
    
    public static void main(String[] args) {
    
    
        Set<String> set = new HashSet<>();
        for (int i = 0; i < 10000; i++) {
    
    
            new Thread(() -> {
    
    
                set.add(Thread.currentThread().getName());
            }).start();
        }
        try {
    
    
            Thread.sleep(1000);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
        System.out.println(set.size());
    }
}

演算結果
ここに画像の説明を挿入

2つ目は、synchronizedSetがHashSetの非スレッド化コード例を解決する

Set<String> set = Collections.synchronizedSet(new HashSet<>());
public class Demo {
    
    
    public static void main(String[] args) {
    
    
        Set<String> set = Collections.synchronizedSet(new HashSet<>());
        for (int i = 0; i < 10000; i++) {
    
    
            new Thread(() -> {
    
    
                set.add(Thread.currentThread().getName());
            }).start();
        }
        try {
    
    
            Thread.sleep(1000);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
        System.out.println(set.size());
    }
}

演算結果
ここに画像の説明を挿入

3つ目は、CopyOnWriteArraySetがHashSetの非スレッドセーフを解決する

 Set<String> set = new CopyOnWriteArraySet<>();
public class Demo {
    
    
    public static void main(String[] args) {
    
    
        Set<String> set = new CopyOnWriteArraySet<>();
        for (int i = 0; i < 10000; i++) {
    
    
            new Thread(() -> {
    
    
                set.add(Thread.currentThread().getName());
            }).start();
        }
        try {
    
    
            Thread.sleep(1000);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
        System.out.println(set.size());
    }
}

最後に、4

最後に、より良い読書体験をするために、私が言いたいことすべてを以下に示します。

私は 私の意志に基づいた決定の種であり私がブログに書いたものは同じ信条
であった深刻な共有です。このブログ投稿を読むことができれば、それは私たちがまだ非常に運命にあることを意味します。私はそれがあなたにいくつかの助けをもたらすことを願っています、作成は簡単ではありません、私の記事の知識を取り除き、あなたの3つの連続した休暇、コメント、フォローなど、私の最大の動機です。

おすすめ

転載: blog.csdn.net/A_hxy/article/details/108771337