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가지 다른 특성을 가진다.
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)을 하므로 느리지만, 반면 자주변경되지 않고 자주 읽혀지는 데이터를 사용할 때에 유용할 것으로 판단.
'프로그래밍 > java' 카테고리의 다른 글
자바의 실수연산에 대한 실수 (0) | 2014.11.24 |
---|---|
자바 입문서로 손색이 없는 '소설같은 자바 2' (0) | 2008.08.30 |
List와 Memory 복사를 이용한 Insertion Sort의 차이... (5) | 2008.07.21 |