>Java >java지도 시간 >Java에서 반복기를 사용하는 동안 ConcurrentModificationException

Java에서 반복기를 사용하는 동안 ConcurrentModificationException

DDD
DDD원래의
2025-02-07 11:18:10766검색

ConcurrentModificationException while using Iterator in Java 멀티 스레드 자바 환경에서 컬렉션을 수정하려고 시도하면 반복기를 사용하여 컬렉션을 수정하려고하면

가 발생할 수 있습니다. 이 예외는 컬렉션의 내부 상태가 일관되지 않기 때문에 발생합니다.

예외를 보여주는 예는 다음과 같습니다 ConcurrentModificationException 이 예외는 이러한 조건에서 발생합니다

반복 중 수정 : 반복자는 동시 수정을 위해 설계되지 않았습니다. FAIL-FAST ITERATORS : 반복자는 내부 플래그 (

)를 사용하여 수정을 감지하고 예외를 던졌습니다.

<code class="language-java">Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:000)
at java.base/java.util.ArrayList$Itr.next(ArrayList.java:000)
at com.journaldev.ConcurrentModificationException.ConcurrentModificationExceptionExample.main(ConcurrentModificationExceptionExample.java:00)</code>
예외를 재현하기위한 알고리즘

이 알고리즘은 java에서 a

를 트리거하는 방법을 보여줍니다 :
    초기화 :
  • . 를 만듭니다
  • 인구 :
  • modCount 반복 : . 를 사용하여 반복자를 얻습니다 수정 :
반복 루프 내부에서

(예 : 요소 추가 또는 제거)를 수정하십시오. 예외 : 는 반복자가 수정을 감지 할 때 던져집니다. 코드 예 : 예외 트리거

이 코드는 ConcurrentModificationException를 던져 반복기가 트래버스하는 동안 목록을 수정하기 때문에

. 안전 수정 기술
  1. 이 예외를 피하려면 다음 접근법을 사용하십시오 ArrayList :
  2. 반복 중에 요소를 제거하려면
  3. 메소드를 사용하십시오. 이 방법은 반복자의 내부 상태로 작동하도록 설계되었으므로 안전합니다. 목록을 복사하십시오 : ArrayList 복사하기 전에 목록의 사본을 작성하고 사본을 수정하십시오.
  4. 동시 컬렉션 사용 : 동시 수정 시나리오의 경우 또는 와 같은 스레드 안전 컬렉션을 사용하십시오. list.iterator()
  5. 동기화 된 블록 :
  6. 스레드 안전을 보장하기 위해 동기화 된 블록 내의 반복 및 수정을 둘러싸십시오. 예 : ArrayList
  7. 를 사용한 안전한 제거
  8. 이 개정 된 코드는 예외를 던지지 않고 요소를 안전하게 제거합니다. 특정 요구 사항과 동시성 요구 사항에 따라 적절한 기술을 선택해야합니다. 동시 컬렉션 사용은 일반적으로 멀티 스레드 시나리오에서 선호됩니다

위 내용은 Java에서 반복기를 사용하는 동안 ConcurrentModificationException의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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