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.base/java.util.ArrayList$Itr.next(ArrayList.java)의 java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042)에서 스레드 "main" java.util.ConcurrentModificationException의 예외 :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을 처리하는 빠른 방법이었습니다 . 막히는 느낌이 들 때마다 자유롭게 뛰어오르세요. 언제나 그렇듯이, 앞으로 나아가는 열쇠는 연습과 인내입니다. 그때까지 계속 배우고 계속 성장하세요.