シングルスレッド アプリケーションでは、通常、 new ArrayList() を使用して、反復可能なデータを格納する List コレクションを指定します。
しかし、マルチスレッドでは、予期せぬ問題が頻繁に発生します。コードは次のとおりです:
import java.util.*; public class ListTest { public static void main(String[] args) throws InterruptedException { // 创建list集合 //List<String> lists = Arrays.asList("1", "2", "3"); // 不安全 List<String> lists = new ArrayList<>(); // 开启十个线程增加数据 for (int i = 1; i <= 40; i++) { new Thread(()->{ lists.add(UUID.randomUUID().toString().substring(0,5)); System.out.println(Thread.currentThread().getName()+"=="+lists); },String.valueOf(i)).start(); } } }
複数のスレッドが同じオブジェクト情報の収集を操作すると、java.util.ConcurrentModificationException エラーが発生することがよくあります。 情報。
Java 言語では、新しい List コレクションである java.util.Vector クラスが提供されます。詳細については、次のコードを参照してください:
import java.util.*; public class ListTest { public static void main(String[] args) throws InterruptedException { // 创建list集合 //List<String> lists = Arrays.asList("1", "2", "3"); // 不安全 //List<String> lists = new ArrayList<>(); List<String> lists = new Vector<>(); // 开启十个线程增加数据 for (int i = 1; i <= 40; i++) { new Thread(()->{ lists.add(UUID.randomUUID().toString().substring(0,5)); System.out.println(Thread.currentThread().getName()+"=="+lists); },String.valueOf(i)).start(); } } }
java.util.ConcurrentModificationException エラー メッセージは表示されません。
データの安全な運用を保証できるのはなぜですか?
メソッド実行呼び出し元をロックする同期を採用し、追加操作のマルチスレッド セキュリティを確保します。
JUC パッケージでは、セキュリティ コレクションを作成する次の方法が提供されます。
方法 1: Collections.synchronizedList(new ArrayList<>());
import java.util.*; public class ListTest { public static void main(String[] args) throws InterruptedException { List<String> lists = Collections.synchronizedList(new ArrayList<>()); // 开启十个线程增加数据 for (int i = 1; i <= 40; i++) { new Thread(()->{ lists.add(UUID.randomUUID().toString().substring(0,5)); System.out.println(Thread.currentThread().getName()+"=="+lists); },String.valueOf(i)).start(); } } }
基礎となるソース コードを表示してロジックを実装する
受信リスト コレクション タイプを確認し、そのタイプが java.util.RandomAccess であるかどうかを確認します。そうである場合は、java.util.Collections.SynchronizedRandomAccessList を使用して、そうでない場合は、java.util.Collections.SynchronizedList を使用してコレクションを構築します。
ソース コード内の対応する追加操作ロジックは次のとおりです。
同期化された同期コード ブロック メソッドを採用してデータを追加します。ロックを実現する操作!
import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; public class ListTest { public static void main(String[] args) throws InterruptedException { List<String> lists = new CopyOnWriteArrayList<>(); // 开启十个线程增加数据 for (int i = 1; i <= 40; i++) { new Thread(()->{ lists.add(UUID.randomUUID().toString().substring(0,5)); System.out.println(Thread.currentThread().getName()+"=="+lists); },String.valueOf(i)).start(); } } }
以上がJava JUC は List セキュリティ クラスのコレクションをどのように操作しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。