///////
Search
🦒

CopyOnWriteArrayList은 어떤 방식으로 스레드 동시성을 보장하나요?

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() 을 하지 못한다