シーン:セットコレクションにデータを格納する際、結果のない最終的な数が見つかっ同時マルチスレッド、調査の後、スレッドセーフセットを使用することにはつながりませんでした
ハハ、説明しませんが、まず、すべてのコード、次のコード、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()); }
:(複数のコンソール出力を実行し、スレッドセーフデジタルを変更し、間違っています)