>  기사  >  Java  >  Java에서 ConcurrentModificationException을 처리하는 방법은 무엇입니까?

Java에서 ConcurrentModificationException을 처리하는 방법은 무엇입니까?

王林
王林원래의
2023-06-25 08:31:431654검색

Java에서 ConcurrentModificationException을 처리하는 방법은 무엇입니까?

Java 프로그래밍에서 ConcurrentModificationException은 매우 일반적인 예외입니다. 이 예외는 반복자(Iterator) 또는 향상된 for 루프(foreach)를 사용하여 컬렉션을 반복할 때 자주 발생합니다. 이번 글에서는 이 예외의 원인과 해결 방법을 소개하겠습니다.

  1. 예외 원인

반복자를 사용하여 컬렉션을 순회할 때 순회 프로세스 중에 컬렉션의 요소가 수정(추가, 삭제 등)되면 ConcurrentModificationException 예외가 발생합니다. 이 예외가 발생하는 이유는 Iterator의 next() 메소드가 호출될 때 현재 modCount가 예상ModCount와 같은지 비교하기 때문입니다. 그렇지 않으면 반복 프로세스 중에 컬렉션이 변경되었음을 의미합니다. , 컬렉션 요소에 추가하거나 삭제하면 modCount의 값은 변경되지만 ExpectModCount의 값은 변경되지 않아 두 값이 동일하지 않게 되고 ConcurrentModificationException 예외가 발생합니다.

  1. 해결 방법

ConcurrentModificationException 발생을 방지하려면 컬렉션을 순회할 때 컬렉션 요소 수정을 피해야 합니다. 일반적으로 세 가지 해결 방법이 있습니다.

(1) 순회하려면 일반 for 루프를 사용하세요.

순회에 일반 for 루프를 사용하는 것은 반복자를 사용하는 대신 첨자를 통해 컬렉션의 요소에 대해 작업을 수행할 수 있기 때문에 실현 가능한 솔루션입니다. 그러나 이 방법은 사용하기가 더 까다롭고 더 많은 양의 코드가 필요합니다.

샘플 코드:

List<String> list = new ArrayList<>();
for(int i = 0; i < list.size(); i++) {
    String str = list.get(i);
    // 对str进行操作
}

(2) Iterator의 제거 메소드 사용

컬렉션을 탐색하는 동안 요소를 수정해야 하는 경우 Iterator의 제거 메소드를 사용하여 삭제 작업을 수행할 수 있습니다. 이 메소드를 사용하면 ConcurrentModificationException을 발생시키지 않고 next() 메소드에 대한 마지막 호출에서 반환된 요소를 삭제할 수 있습니다.

샘플 코드:

List<String> list = new ArrayList<>();
Iterator<String> it = list.iterator();
while(it.hasNext()) {
    String str = it.next();
    if(str.equals("hello")) {
        it.remove();
    }
}

(3) CopyOnWriteArrayList 사용

CopyOnWriteArrayList는 읽기-쓰기 분리 기능을 통해 컬렉션에 요소를 추가하거나 삭제할 때 현재 스레드에 영향을 주지 않습니다. . 요소가 변경되면 CopyOnWriteArrayList는 데이터의 새 복사본을 만든 다음 해당 복사본에 대해 작업을 수행합니다. 따라서 CopyOnWriteArrayList는 읽기가 많고 쓰기가 적은 시나리오에 적합합니다.

샘플 코드:

List<String> list = new CopyOnWriteArrayList<>();
Iterator<String> it = list.iterator();
while(it.hasNext()) {
    String str = it.next();
    if(str.equals("hello")) {
        list.remove(str);
    }
}

위는 ConcurrentModificationException 예외를 방지하기 위해 사용하는 일반적인 방법입니다. 실제 프로그래밍에서는 프로그램의 견고성과 효율성을 보장하기 위해 실제 상황에 맞는 방법을 선택해야 합니다.

위 내용은 Java에서 ConcurrentModificationException을 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.