링크 : 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의 경우에는 동작이 항상 같지 않다.
'안드로이드' 카테고리의 다른 글
[안드로이드] ImageCache 사용 중, 이미지의 크기가 변하는 현상 (0) | 2013.12.13 |
---|---|
[안드로이드] RenderScript 빌드 오류 문제 해결 (0) | 2013.11.12 |
[안드로이드] ActionBar Indicator 커스텀마이징하기 (0) | 2013.10.30 |
[안드로이드] InputStream을 닫는데 왜 오래 걸릴까? (0) | 2013.04.19 |
[안드로이드] Dialog.dismiss()를 할 때, java.lang.IllegalArgumentException: View not attached to window manager 예외 회피하기 (2) | 2013.03.08 |
[안드로이드] APK 파일 SIGN 하기 (0) | 2012.10.29 |
안드로이드 ListView와 Thread를 사용할 때 동기화 오류 (IllegalStateException) (0) | 2012.10.08 |
[안드로이드] uncaught exception 사용하기 (UncaughtExceptionHandler) (0) | 2012.10.02 |
[안드로이드] Context를 Activity로 강제 타입 캐스팅시 발생하는 문제(Shutting down VM) (0) | 2012.10.02 |
[안드로이드] ListView의 fadingEdge 없애는 방법 (0) | 2012.09.26 |