CodeGym /Java Blog /무작위의 /Java의 ConcurrentModificationException
John Squirrels
레벨 41
San Francisco

Java의 ConcurrentModificationException

무작위의 그룹에 게시되었습니다

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을 처리하는 빠른 방법이었습니다 . 막히는 느낌이 들 때마다 자유롭게 뛰어오르세요. 언제나 그렇듯이, 앞으로 나아가는 열쇠는 연습과 인내입니다. 그때까지 계속 배우고 계속 성장하세요.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION