ホームページ >Java >&#&チュートリアル >Java リストの反復および変更時に ConcurrentModificationException を回避するにはどうすればよいですか?
ConcurrentModificationException は、複数のスレッドが変更可能なコレクションを同時に変更し、多くの場合その内部一貫性に違反する場合に発生します。この概念を説明するために、この例外が発生するコード スニペットを分析してみましょう。
import java.util.*; public class ConcurrentModificationExample { 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); } }
このコードは、リストに要素を追加しながら、リストを反復処理しようとします。ただし、要素が追加される前に ListIterator が作成されたため、例外がスローされます。
このエラーを回避するには、コードを次のように変更できます。
import java.util.*; public class ConcurrentModificationExample { 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); } }
この改訂されたコードでは、要素がリストに追加された後にリスト反復子が作成され、一貫性が確保されます。 ListIterator では反復中にリストを変更できますが、リストが初期化された後に作成され、作成から使用までの間に変更されないことが重要です。これにより、反復を通じてリストが有効な状態に保たれることが保証されます。
以上がJava リストの反復および変更時に ConcurrentModificationException を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。