ホームページ >Java >&#&チュートリアル >Java リストの反復および変更時に ConcurrentModificationException を回避するにはどうすればよいですか?

Java リストの反復および変更時に ConcurrentModificationException を回避するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-29 13:25:11505ブラウズ

How Can I Avoid ConcurrentModificationException When Iterating and Modifying a Java List?

Java の同時変更例外について

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。