본문 바로가기

프로그래밍/java

CopyOnWriteArrayList in Java

What is CopyOnWriteArrayList in Java - Example Tutorial
java.util.concurrent.CopyOnWriteArrayList<E>

자바를 사용한 지는 1.2 때부터 사용했지만, 1.3 이후부터는 사실상 추가된 Spec에 대해 공부한 적이 별로 없다. 최근 "Effective Java 2nd"을 발췌독 중에 재미있는 내용이 있어 간략히 정리해 본다.

대게 자바의 List 는 ArrayList를 많이 사용하게 되는데 Thread-safe 하지 않기 때문에 Iterator 혹은 For-each 문 내에서 remove 메소드를 사용하면 
ConcurrentModificationException 예외를 자주 만나게 된다.

이런 경우 나는 별도의 객체를 생성하여 add 하거나 delete 리스트를 만들어 관리한다거나 하는 우회하는 방법을 사용했다. 하지만 Java 1.5 부터 concurrent 패키지 내부에 CopyOnWriteArrayList 라는 클래스가 탄생했으니...

이는 ArrayList와 비교해 아래와 같은 3가지 다른 특성을 가진다.
   ArrayList   CopyOnWriteArrayList 
 Thread-safe  No   Yes 
 Fail-while-loop-remove  Yes   No 
 Using-remove-while-loop  Yes  No

CopyOnWriteArrayList 경우, 쓰레드에 안전하나 For-each 반복문을 위한 clone(deeep-copy)을 하므로 느리지만, 반면 자주변경되지 않고 자주 읽혀지는 데이터를 사용할 때에 유용할 것으로 판단.