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

Susan Sarandon
リリース: 2024-11-21 09:43:10
オリジナル
375 人が閲覧しました

How Can I Avoid Concurrent Modification Exceptions When Iterating and Modifying Java Lists?

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

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