ホームページ >Java >&#&チュートリアル >Java でコレクションを反復処理するときに ConcurrentModificationException を回避するにはどうすればよいですか?
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); } }
このコードは反復を試みます。 ListIterator を使用してリストを調べます。ただし、反復子 (it) を使用してリストを走査しているときに、新しい要素がリスト (s.add(a)) に追加されると、同時変更例外が発生する可能性があります。
この問題を解決するには、次のようにします。 Java はフェイルファスト反復子を提供します。イテレータがコレクションにアクセスしようとするたびに、そのイテレータの初期アクセスを超えてコレクションが変更されたかどうかがチェックされます。イテレータのアクセス ポイントを超えてコレクションが変更された場合、ConcurrentModificationException 例外がスローされます。
同時変更例外を回避する更新されたコード スニペットを以下に示します。
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); } }
ListIterator はイテレータの作成前に発生した変更を識別できず、イテレータの作成中に発生した変更のみを識別できることに留意することが重要です。 使用済み。さらに、反復子は同時変更の発生を防ぐのではなく、同時変更を検出し、発生時に例外をスローします。同時変更を完全に防ぐには、同期メカニズムを使用する必要があります。
以上がJava でコレクションを反復処理するときに ConcurrentModificationException を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。