ホームページ  >  記事  >  Java  >  Java リストの反復および変更時に同時変更例外を回避するにはどうすればよいですか?

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

Susan Sarandon
Susan Sarandonオリジナル
2024-11-21 09:43:10377ブラウズ

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

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