スレッドセーフなコレクションセットの使用に関するjava8

シーン:セットコレクションにデータを格納する際、結果のない最終的な数が見つかっ同時マルチスレッド、調査の後、スレッドセーフセットを使用することにはつながりませんでした

 

ハハ、説明しませんが、まず、すべてのコード、次のコード、Sets.newHashSetの使用()とCollections.synchronizedSet(Sets.newHashSet())スレッドセーフではありません最初にそのコレクションセットを宣言するには、2つの方法が、あるを説明2つのスレッドセーフ

コード:

 パブリック 静的 ボイドメイン(文字列[]引数){ 
        ExecutorServiceのエグゼキュータは = 新しい新しいThreadPoolExecutor(
                 10、20、0Lで、TimeUnit.MILLISECONDS、新しい新しい LinkedBlockingQueue <>(100000 )、threadFactory); 

        //は、0から69999までの数値文字列を入れて、重複 
        numlist =一覧<string>をLists.newArrayList()
         のためのINT I = 0; I <70000; I ++ ){ 
            numList.add(String.valueOf(I)); 
        } 

        // セット2000が設定されます分離 
        リスト<リスト<文字列>> tmpNumList = ToolsUtil.spliceArrays(numlist、2000 ); 

        // 実行するために複数のスレッド
        一覧<今後の<整数>> futureList = 新しい ArrayListを<> (); 
        セットの<string> numSet = Sets.newHashSet()。
        セットの<string> numSyncSet = Collections.synchronizedSet(Sets.newHashSet())。
        tmpNumList.forEach(リスト - > futureList.add(executor.submit(() - > { 
            list.forEach(NUM - > { 
                numSet.add(NUM); 
                numSyncSet.add(NUM); 
            }); 
            リターン 1 ; 
        }) )); 

        futureList.forEach(未来 - > {
             トライ {
                future.get();
            } キャッチ(例外E){ 
                logger.warn( "エラー" 、E); 
            } 
        }); 

        // 結果を出力 
        するSystem.out.println( "スレッドセーフセット:" + numSet.size()); 
        システム.out.println( "セットのスレッド安全性:" + numSyncSet.size()); 
    }

:(複数のコンソール出力を実行し、スレッドセーフデジタルを変更し、間違っています)

 

おすすめ

転載: www.cnblogs.com/JoeyWong/p/11971810.html