본문 바로가기

공부/Java

Iterator 사용 중 ConcurrentModificationException 발생 회피 방법

[문제 증상]
Iterator로 맵 등을 순회 중 다른 스레드에 의한 add 등의 연산으로 ConcurrentModificationException 발생

[해결법]
1. Iterator로 순회할 자료 구조를 복사하여 복사 값을 사용
예) List 를 array로 변환, List의 clone() 메소드 사용
즉, 다른 스레드에서 삽입/삭제 등의 작업을 하는 자료 구조를 복사하여 복사 값을 순회함으로써 오류를 회피

* 단점: 자료구조 내의 원소가 많을 경우, 성능상의 부하를 줄 수 있음


2. 해당 자료구조에 대한 연산을 수행하는 부분을 synchronized 블록으로 감싼다. 

* 단점: 스레드의 장점을 사용할 수 없음


3. 자바 버전 1.5 이상 사용 시, ConcurrentHashMap, CopyOnWriteArrayList 등의 자료구조 사용



[참고 문헌]
[1] http://www.javacodegeeks.com/2011/05/avoid-concurrentmodificationexception.html
[2] 
http://park1020.tistory.com/entry/javautilConcurrentModificationException