•
ArrayList는 동시성을 보장하지 않는다
◦
해당되는 메서드나 블록을 한 번에 한 스레드씩 수행하도록 보장해주는 synchroized 키워드를 써야한다. 스레드가 필요 이상으로 따라 멈추거나 기다려야만 하는 상황을 유발시키므로 성능에 좋지 않다
•
CopyOnWriteArrayList
◦
java.util.concurrent
◦
thread-safe
▪
읽기를 할 때는 잠금이 걸리지 않지만
▪
CopyOnWriteArrayList를 수정해야 할 때 (add(), remove(), set())는 락을 걸고 임시로 객체의 복사본을 만들어서 수정하고 원본을 대체시킨다
▪
이렇게 함으로써 객체의 데이터를 읽을 때 수정 중인 데이터들에 접근하지 못하도록 한다 (동시성 보장)
▪
읽기를 할때는 잠금이 걸리지 않아 빠르게 수행할 수 있지만, 수정을 하려면 복사본을 만들어야 하기 때문에 수정을 거의 하지 않고 읽기를 자주 해야할 때 써야 효율적이다
◦
Iterator
▪
CopyOnWriteArrayList에서 iterator를 생성하는 순간 객체의 복사본(immutable snapshopt)이 만들어 진다 이 복사본은 수정할 수 없으며 iterator가 생성된 시점의 데이터를 사용하기 때문에 이후에 수정된 데이터를 반영하지 않는다
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
// Initial Iterator
Iterator itr = list.iterator();
list.add("Hi");
System.out.println("List contains: ");
while (itr.hasNext())
System.out.println(itr.next());
// iterator after adding an element
itr = list.iterator();
System.out.println("List contains:");
while (itr.hasNext())
System.out.println(itr.next());
Java
복사
List contains:
List contains:
GfG
Plain Text
복사
출력
List contains:
List contains:
Hi
Java
복사
▪
iterator를 사용해서 remove, add, set() 을 하지 못한다