ホームページ > Java > &#&チュートリアル > JavaでIteratorを使用しながら、ConcurrentModificationException

JavaでIteratorを使用しながら、ConcurrentModificationException

DDD
リリース: 2025-02-07 11:18:10
オリジナル
764 人が閲覧しました

ConcurrentModificationException while using Iterator in Java

マルチスレッドJava環境では、イテレーターを使用して繰り返しながらコレクションを変更しようとすると、

につながる可能性があります。この例外は、コレクションの内部状態が一貫性がないために発生します。 ConcurrentModificationException例外を示す例を次に示します:

この例外は、これらの条件の下で発生します:
Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:000)
at java.base/java.util.ArrayList$Itr.next(ArrayList.java:000)
at com.journaldev.ConcurrentModificationException.ConcurrentModificationExceptionExample.main(ConcurrentModificationExceptionExample.java:00)
ログイン後にコピー

反復中の変更:iteratorは、同時変更のために設計されていません。
    フェイルファストイテレーター:iteratorは内部フラグ(
  • )を使用して変更を検出し、例外をスローします。
  • 例外を再現するためのアルゴリズム
  • modCountアルゴリズム

このアルゴリズムは、javaでa をトリガーする方法を示しています:

ConcurrentModificationException初期化:

  1. を作成します 母集団:ArrayList
  2. iteration: ArrayListの変更:
  3. 反復ループ内で、
  4. (たとえば、要素を追加または削除するか削除します)を変更します。 例外:list.iterator()
  5. イテレーターが変更を検出したときにスローされます。
  6. コードの例:例外のトリガーArrayList
  7. このコードは、がリストを変更している間にConcurrentModificationExceptionをスローします。
安全な修正手法

この例外を回避するには、これらのアプローチを使用してください

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ConcurrentModificationExample {
    public static void main(String[] args) {
        List<Integer> myList = new ArrayList<>();
        myList.add(1);
        myList.add(2);
        myList.add(3);

        Iterator<Integer> iterator = myList.iterator();
        while (iterator.hasNext()) {
            Integer value = iterator.next();
            System.out.println("Value: " + value);
            if (value == 2) {
                myList.remove(value); // Modification during iteration!
            }
        }
    }
}
ログイン後にコピー

ConcurrentModificationExceptionmyList.remove(value)

メソッドを使用して、反復中に要素を削除します。この方法は、イテレーターの内部状態で動作するように設計されているため安全です。

リストをコピーします:

コピーを反復して変更する前に、リストのコピーを作成します。

  • 同時コレクションを使用します:同時修正シナリオの場合、Iterator.remove()iterator.remove()などのスレッドセーフコレクションを使用

  • 同期ブロック:同期ブロック内で反復と変更を囲み、スレッドの安全性を確保します。

  • 例:

    を使用した安全な除去 CopyOnWriteArrayList ConcurrentHashMapこの改訂されたコードは、例外をスローせずに要素を安全に削除します。 特定のニーズと並行性の要件に基づいて、適切な手法を選択することを忘れないでください。 マルチスレッドシナリオでは、一般に同時コレクションを使用することが推奨されます

以上がJavaでIteratorを使用しながら、ConcurrentModificationExceptionの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
ヘルプ: JAVA 暗号化データ PHP 復号化
から 1970-01-01 08:00:00
0
0
0
JAVAをインストールする
から 1970-01-01 08:00:00
0
0
0
Javaをインストールできません
から 1970-01-01 08:00:00
0
0
0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート