ConcurrentModificationException

ConcurrentModificationException (동시 수정 예외)

객체에 대해 허용되지 않는 동시 수정이 감지됐을 때 메서드가 던질 수 있는 예외예요. 예를 들어 한 쓰레드가 Collection을 순회하는 중에 다른 쓰레드가 그 컬렉션을 수정하는 것은 일반적으로 허용되지 않아요.

출처: Java API Reference

본문

이 예외가 항상 다른 쓰레드에 의한 수정을 의미하는 것은 아니에요. 단일 쓰레드가 객체의 계약을 위반하는 일련의 메서드 호출을 하더라도 이 예외가 던져질 수 있어요. 예를 들어 fail-fast iterator로 컬렉션을 순회하면서 동시에 직접 수정하면 iterator가 이 예외를 던져요.

fail-fast 반복자는 이런 동작을 감지하면, 미래의 어느 시점에 임의적이고 비결정적인 동작을 할 위험을 감수하는 대신 빠르고 깨끗하게 실패하는 반복자를 말해요.

List<String> list = new ArrayList<>();
for (String s : list) {        // 추가/수정 시
    if (condition) list.add("x"); // ConcurrentModificationException
}

다만 fail-fast 동작은 보장되지 않아요. 동기화되지 않은 동시 수정이 있는 상황에서 완고한 보장을 하기는 일반적으로 불가능하기 때문이에요. fail-fast 연산은 최선의 노력(best-effort)으로 이 예외를 던져요.

그래서 이 예외에 의존해서 프로그램의 정확성을 보장하는 것은 잘못된 일이에요. ConcurrentModificationException은 오직 버그를 발견하는 용도로만 사용해야 해요. 코드와 시그니처는 원문 그대로 보존돼요.

더 알아보기