Java の ConcurrentModificationException とは何ですか?

「ConcurrentModificationException は、変更の権限を持たない状態でリソースが変更されると発生します。」
つまり、Java ConcurrentModificationException (名前が示すとおり) は同時実行性の問題が原因で発生します。先に進む前に、スレッドマルチスレッド についての事前知識があることを前提としています。Collection クラスなど、Java の一部のクラスでは、別のスレッドが要素を反復している間、スレッドが要素を変更することはできません。変更操作 (追加、削除など) が実行されると、プログラムはConcurrentModificationExceptionをスローします。この例外が発生するのはこれだけではありません。ただし、さらに深く掘り下げることは、この記事の範囲外になります。

この例外がどのように発生するかの例を見てみましょう。
import java.util.List;
import java.util.Iterator;
import java.util.ArrayList;

//Test driver for ConcurrentModificationException
public class ConcurrentModificationExceptionTestDriver1 {

	public static void main(String[] args) {
		List<String> businessDays = new ArrayList<>();

		businessDays.add("Monday");
		businessDays.add("Tuesday");
		businessDays.add("Wednesday");
		businessDays.add("Thursday");
		businessDays.add("Friday");
		businessDays.add("Saturday");
		businessDays.add("Sunday");

		Iterator<String> iterator = businessDays.iterator();
		while (iterator.hasNext()) {
			String day = iterator.next();
			if (day.equals("Sunday")) {
				// removing a list item while iterating
				// leading to java.util.ConcurrentModificationException
				businessDays.remove(day);
			}
		}
	}
}

出力

スレッド「メイン」での例外 java.util.ConcurrentModificationException (java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042)、java.base/java.util.ArrayList$Itr.next(ArrayList.java) :996) マイルストーン.thirty.seven.ConcurrentModificationExceptionTestDriver1.main(ConcurrentModificationExceptionTestDriver1.java:22) で

Java で ConcurrentModificationException を回避するには?

ConcurrentModificationExceptionにはさまざまな回避策があります。ここに数名が参加しています。ニーズに応じて誰でも選択できます。
  1. 反復中の変更は避けてください。
  2. 反復と変更を同時に行うには、従来のループを使用します。
  3. イテレータの使用中に変更する値のコピーを作成します。反復が終了したら値を更新します。

ConcurrentModificationException を回避する方法の例を次に示します。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

//Test driver for ConcurrentModificationException
public class ConcurrentModificationExceptionTestDriver2 {

	public static void main(String[] args) {

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

		businessDays.add("Monday");
		businessDays.add("Tuesday");
		businessDays.add("Wednesday");
		businessDays.add("Thursday");
		businessDays.add("Friday");
		businessDays.add("Saturday");
		businessDays.add("Sunday");

		System.out.println("Initial Business Days: " + businessDays);

		// Method II - Using traditional for loop
		for (int i = 0; i < businessDays.size(); i++) {
			if (businessDays.get(i).equals("Sunday")) {
				businessDays.remove(i);
			}
		}

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

		// Method III - Creating a copy of elements
		while (iterator.hasNext()) {
			String day = iterator.next();
			if (day.equals("Saturday")) {
				// Add values to be removed in the list
				businessDaysToBeRemoved.add(day);
			}
		}
		businessDays.removeAll(businessDaysToBeRemoved);
		System.out.println("Final Business Days: " + businessDays);
	}
}

出力

初営業日:[月、火、水、木、金、土、日] 最終営業日:[月、火、水、木、金]

結論

以上が、 Java でのConcurrentModificationExceptionの簡単な処理でした。行き詰まりを感じたときはいつでも気軽に飛び乗ってください。いつものように、前進するための鍵は練習と忍耐です。それまでは学び続け、成長し続けてください。