ホームページ  >  記事  >  Java  >  Java同時変更例外(ConcurrentModificationException)の解決方法

Java同時変更例外(ConcurrentModificationException)の解決方法

WBOY
WBOYオリジナル
2023-08-19 10:25:441878ブラウズ

Java同時変更例外(ConcurrentModificationException)の解決方法

Java 同時変更例外 (ConcurrentModificationException) の解決方法

Java プログラミングでは、複数のスレッドがコレクション クラスのオブジェクトを同時に変更すると、 「ConcurrentModificationException」例外。この記事では、例外の原因について説明し、さまざまな解決策とコード例を示します。

1. 例外の理由

1.1 コレクション クラスの構造
ConcurrentModificationException 例外は通常、ArrayList、HashMap などのイテレータベースのコレクション クラスで発生します。これらは内部で modCount 変数を使用して、コレクションが変更された回数を記録します。

1.2 同時変更
あるスレッドが反復操作を実行しているときに、別のスレッドがコレクションを追加、削除、または変更することで modCount の値が変更され、反復子はコレクションが変更されたと認識します。 ConcurrentModificationException 例外が発生しました。

2. 解決策

2.1 イテレータのremoveメソッドを使用する
Javaコレクションクラスのイテレータには、コレクション要素から現在の反復を安全に削除できるremoveメソッドが用意されています。

List<String> list = new ArrayList<>();
Iterator<String> iterator = list.iterator();

while (iterator.hasNext()) {
    String element = iterator.next();
    if (condition) {
        iterator.remove();
    }
}

2.2 同時実行コレクション クラスの使用
Java 同時実行パッケージ (java.util.concurrent) は、一連のスレッドセーフなコレクション クラスを提供します。これらはすべて、同時変更の問題を解決するために異なる同時実行メカニズムを使用します。
たとえば、HashMap の代わりに ConcurrentHashMap を使用します。

import java.util.concurrent.ConcurrentHashMap;

ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");

for (Map.Entry<String, String> entry : map.entrySet()) {
    if (condition) {
        map.remove(entry.getKey());
    }
}

2.3 同期メカニズムを使用する
synchronized キーワードを使用してコレクションを同期し、同時に 1 つのスレッドのみがコレクションにアクセスできるようにします。同時変更例外を回避します。

List<String> list = new ArrayList<>();

synchronized (list) {
    for (String element : list) {
        if (condition) {
            list.remove(element);
        }
    }
}

2.4 CopyOnWriteArrayList の使用
CopyOnWriteArrayList は、同時変更例外を回避するために、書き込み (追加、削除、変更) 操作中に新しいコレクション コピーを作成するスレッド セーフなコレクション クラスです。

import java.util.concurrent.CopyOnWriteArrayList;

CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("item1");
list.add("item2");

for (String element : list) {
    if (condition) {
        list.remove(element);
    }
}

3. 概要

Java 同時変更例外 (ConcurrentModificationException) は、複数のスレッドがコレクション クラス オブジェクトを同時に変更することによって発生します。この問題を解決するには、イテレータの削除メソッド、同時コレクション クラス、同期メカニズム、または CopyOnWriteArrayList などのメソッドを使用できます。実際の状況に応じて適切な方法を選択して、同時変更例外を解決し、プログラムの安定性と信頼性を確保します。

4. 参考資料

  1. 「Java で ConcurrentModificationException を解決する方法」、Baeldung、https://www.baeldung.com/java-concurrentmodificationException
  2. " Java の ConcurrentModificationException – 回避方法」、JournalDev、https://www.journaldev.com/378/how-to-avoid-concurrentmodificationException-in-java

以上がJava同時変更例外(ConcurrentModificationException)の解決方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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