본문 바로가기
Error(Exception)/ERROR-JAVA

[자바(java)] ConcurrentModificationException

by control+c 2023. 2. 15.
반응형

ConcurrentModificationException (컨커런트 모디파이케이션 예외)

자바의 일부 컬렉션 클래스들은 동시에 수정할 수 없는 상황이 발생할 때 발생하는 예외. 자바 5부터 발생하는 예외로 스레드 안전성을 유지하기 위해 추가되었다.

ConcurrentModificationException이란?

ConcurrentModificationException은 컬렉션의 내부 구조가 변경되는 동안 다른 값들이 추가되거나, 삭제되거나, 수정되는 것을 막기 위해 발생하는 예외이다. 예를 들어, 배열이 수정되는 동안 배열에 새로운 값을 추가하거나 삭제하려고 할 때 발생하는 예외이다.

ConcurrentModificationException 예시

다음 코드는 ConcurrentModificationException을 일으키는 예시이다.

List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");

for (String str : list) {
    if (str.equals("B")) {
        list.remove(str); // 이 라인에서 ConcurrentModificationException이 발생한다.
    }
}

ConcurrentModificationException 해결 방법

ConcurrentModificationException을 해결하기 위해 여러가지 방법이 있다.

1. Iterator 사용

Iterator는 컬렉션의 요소들을 순회하면서 수정할 수 있는 방법이다. Iterator를 사용하면 컬렉션을 순회하는 동안 수정할 수 있기 때문에 ConcurrentModificationException을 방지할 수 있다.

List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");

Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
    String str = iter.next();
    if (str.equals("B")) { 
        iter.remove(); // Iterator를 사용하면 이 라인에서 ConcurrentModificationException이 발생하지 않는다.
    }
}

2. 복사본을 만들고 사용하기

컬렉션의 복사본을 만들고 그 복사본을 사용하면 ConcurrentModificationException이 발생하지 않는다.

List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");

List<String> tmpList = new ArrayList<String>(list);
for (String str : tmpList) {
    if (str.equals("B")) { 
        list.remove(str); // 복사본을 사용하면 이 라인에서 ConcurrentModificationException이 발생하지 않는다.
    }
}

요약

ConcurrentModificationException은 자바 5부터 발생하는 예외로 스레드 안전성을 유지하기 위해 추가되었다. 컬렉션의 내부 구조가 변경되는 동안 다른 값들이 추가되거나, 삭제되거나, 수정되는 것을 막기 위해 발생하는 예외이다. ConcurrentModificationException을 해결하기 위해 Iterator 사용 또는 복사본을 만들고 사용하는 방법이 있다.

반응형

댓글