>Java >java지도 시간 >`synchronized`를 사용하는 경우에도 ConcurrentModificationException이 발생하는 이유는 무엇입니까?

`synchronized`를 사용하는 경우에도 ConcurrentModificationException이 발생하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-09 01:56:02265검색

Why Do I Get ConcurrentModificationException Even When Using `synchronized`?

Synchronized를 사용해도 ConcurrentModificationException을 어떻게 받을 수 있나요?

Synchronized 키워드를 사용하면 모든 동시성 문제를 방지할 수 있다고 가정하는 것이 일반적입니다. 그러나 한 번에 하나의 스레드가 동기화된 코드 블록에 액세스할 수 있도록 보장합니다. 반복되는 컬렉션 수정을 막지는 않습니다.

다음 코드를 고려하세요.

public synchronized X getAnotherX() {
  if (iterator.hasNext()) {
    X b = iterator.next();
    String name = b.getInputFileName();
    ...
    return b;
  } else {
    return null;
  }
}

동기화 선언 헤더는 전체 메소드가 한 번에 하나의 스레드에 의해 실행되도록 보장합니다. 시간. 그러나 반복자가 액세스하는 컬렉션이 다른 스레드에 의해 수정되는 것을 방지하지는 않습니다.

ConcurrentModificationException이 발생하는 이유는 무엇입니까?

ConcurrentModificationException은 일반적으로 수정할 때 발생합니다. 반복 루프 내에서 반복되는 컬렉션입니다. 예를 들어 다음 코드는 이 예외를 발생시킵니다.

Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
    Item item = (Item) iterator.next();
    if (item.satisfiesCondition()) {
        collection.remove(item);
    }
}

이 경우 대신 iterator.remove() 메서드를 사용하여 요소를 제거해야 합니다. 컬렉션에 추가해야 하는 경우 동기화된 방법을 사용할 수 없습니다. 그러나 목록을 다루는 경우 add() 메서드를 제공하는 ListIterator 하위 유형을 사용할 수 있습니다.

위 내용은 `synchronized`를 사용하는 경우에도 ConcurrentModificationException이 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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