Java の同時変更例外
「同時変更」例外は、複数のスレッドが共有データ構造を変更しようとすると発生します。リストを同時に作成します。これにより、予期しない結果やデータの破損が発生する可能性があります。
次の Java コードを考えてみましょう。
import java.util.*; public class SomeClass { public static void main(String[] args) { List<String> s = new ArrayList<>(); ListIterator<String> it = s.listIterator(); for (String a : args) s.add(a); if (it.hasNext()) String item = it.next(); System.out.println(s); } }
このコードは、リストを変更しながら同時にリストを反復処理しようとします。実行すると、「同時変更例外」がスローされます。これは、リストに変更が加えられる前にリスト反復子が作成されたためです。
この例外を回避するには、一度に 1 つのスレッドのみがリストを変更できるようにする必要があります。これを行うには、リストに対するすべての変更が行われた後にのみ反復子を作成します。正しいコードは次のとおりです。
import java.util.*; public class SomeClass { public static void main(String[] args) { List<String> s = new ArrayList<>(); for(String a : args) s.add(a); ListIterator<String> it = s.listIterator(); if(it.hasNext()) { String item = it.next(); } System.out.println(s); } }
リストの変更後に反復子を作成することで、反復中に単一のスレッドのみがリストにアクセスできるようになります。これにより、「同時変更例外」の発生が防止されます。
以上がJava リストの反復および変更時に同時変更例外を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。