Synchronized 사용 시 ConcurrentModificationException
getAnotherX 메서드를 동기화해도 iterator.next()를 호출할 때 ConcurrentModificationException 예외가 발생합니다. 이것이 발생하는 이유를 이해하려면 ConcurrentModificationException의 특성을 이해하는 것이 중요합니다.
ConcurrentModificationException의 특성
이름과 달리 ConcurrentModificationException은 주로 여러 스레드로 인해 발생하지 않습니다. . 반복 루프 내에서 반복되는 컬렉션을 수정할 때 종종 발생합니다. 예는 다음과 같습니다.
Iterator iterator = collection.iterator(); while (iterator.hasNext()) { Item item = (Item) iterator.next(); if (item.satisfiesCondition()) { collection.remove(item); } }
이 시나리오에서는 collection.remove(item) 대신 iterator.remove()를 사용하는 것이 필수적입니다. 이 예외는 컬렉션에 추가할 때도 발생할 수 있습니다. 안타깝게도 이 경우에는 일반적인 해결책이 없습니다. 그러나 List를 다루는 경우 add() 메서드가 있는 ListIterator를 사용할 수 있습니다.
위 내용은 동기화를 사용하는 경우에도 ConcurrentModificationException이 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!