본문 바로가기
안드로이드

[안드로이드] Collection을 사용 할 때 ConcurrentModificationException을 피하는 방법

by 호군 2013. 3. 6.
반응형

링크 : http://www.javacodegeeks.com/2011/05/avoid-concurrentmodificationexception.html


자바 Collection 클래스는 다른 thread에서 iterator를 사용하여 루프를 돌고 있을 때, Collection이 변경되어지면, 이 때 iterator.next()를 호출하는 순간에 ConcurrentModificationException 예외를 발생합니다.


이 예외는 multi-thread 뿐만 아니라 단일 single-thread에서도 발생 할 수 있습니다.





multi-thread 환경에서 ConcurrentModificationException 회피하기


1. List를 새로운 List객체에 복사해라.

    이 방법은 List의 개수가 적거나 보통이라면 괜찮은 방법입니다.

   하지만 개수가 많으면 성능 저하의 원인이 될 수 있습니다.


2. 루프를 도는 코드를 syncchronized 블럭으로 감싸라.
    이 방법은 multi-thread의 장점을 감소시키므로 추천하지 않는 방법입니다.


3. JDK 1.5 이상에서는 ConcurrentHashMap이나 CopyOnWriteArrayList 클래스를 사용해라.
    이 방법은 가장 권장되는 방법입니다.





single-thread 환경에서 ConcurrentModificationException 회피하기


1. Concurrent Collection 클래스를 사용해라.


2. CopyOnWriteArrayList의 경우에는 리스트 내에서 변경을 수용하지 않는다.


3. ConcurrentHashMap의 경우에는 동작이 항상 같지 않다.









반응형