본문으로 건너뛰기
김신건의 로그

[Java] CopyOnWriteArraySet

· 수정 · 📖 약 1분 · 261자/단어 #java #concurrent #set #copy-on-write
CopyOnWriteArraySet, java.util.concurrent.CopyOnWriteArraySet, CoW Set, copy-on-write set

정의

java.util.concurrent.CopyOnWriteArraySet<E>CopyOnWriteArrayList 를 백킹으로 사용하는 thread-safe Set. 중복 검사를 위해 매 add 마다 contains (O(n)) 를 수행.

CopyOnWriteArrayList 의 모든 특성 (snapshot iterator, 읽기 lock-free, 쓰기 시 전체 복사) 을 물려받는다.

내부 구조

public class CopyOnWriteArraySet<E> extends AbstractSet<E> ... {
    private final CopyOnWriteArrayList<E> al;

    public boolean add(E e) {
        return al.addIfAbsent(e);    // 선형 검색 후 없으면 추가
    }
}

복잡도

작업시간
add(e)O(n) (검색 + 전체 복사)
contains(o)O(n) (선형 검색)
remove(o)O(n) (검색 + 복사)
순회O(n) (snapshot)

CAUTION

add 가 O(n) 이다. n 이 작거나 (수십 이하), 쓰기가 거의 없는 경우에만 사용. n 이 크면 ConcurrentHashMapnewKeySet() 또는 Collections.synchronizedSet(new HashSet<>()) 이 훨씬 빠르다.

사용 사례

CopyOnWriteArrayList 와 동일한 패턴.

  • 이벤트 리스너 집합
  • 옵저버 패턴 구독자
  • 설정 / 메타데이터 집합, 변경 드묾

동시성 Set 비교

옵션addcontainsiterator
CopyOnWriteArraySetO(n) + 전체 복사O(n)snapshot
ConcurrentHashMap.newKeySet()O(1) avgO(1) avgweakly consistent
Collections.synchronizedSet(HashSet)O(1) + 락O(1) + 락fail-fast (외부 동기화 필요)
ConcurrentSkipListSetO(log n)O(log n)weakly consistent, 정렬

참고

이 글의 용어 (7개)
[Java] Collectionjava
정의 는 그룹으로 묶인 객체들을 표현하는 최상위 인터페이스. JCF (Java Collections Framework) 의 입구이자, / / / 모두 이를 확장한다. 자체는 직접…
[Java] ConcurrentHashMapjava
정의 는 고동시성 환경에서 사용 가능한 구현. JSR-166 (Java 5) 도입, Java 8 에서 내부 구조가 크게 재작성됐다. 과 같은 인터페이스를 제공하면서 thread-…
[Java] ConcurrentSkipListSetjava
정의 는 을 백킹으로 사용하는 정렬된 thread-safe . 의 동시성 버전. 인터페이스 구현. floor, ceiling, subSet 등 정렬 기반 연산 제공. 복잡도 의 …
[Java] CopyOnWriteArrayListjava
정의 는 쓰기 시 배열 전체를 복사 하는 thread-safe 구현. 읽기에는 lock 이 전혀 없고, 쓰기에는 으로 직렬화한다. (JSR-166) 의 컬렉션. 읽기 압도적 다,…
[Java] Iterablejava
정의 는 루프로 순회 가능한 모든 타입의 최상위 인터페이스. 단 하나의 추상 메서드, 를 정의한다. 인터페이스가 을 extends 하므로 , , , 등 모든 컬렉션이 자동으로 대…
[Java] Objectjava
정의 는 Java 의 모든 클래스의 최상위 부모 (root) 클래스. 가 명시되지 않은 클래스는 컴파일러가 자동으로 를 붙인다. 인터페이스는 클래스가 아니라 를 직접 상속하지는 …
집합과 맵 (Set and Map)algorithm
정의 집합 (Set) 은 고유한 원소들의 모임을 나타내는 추상 자료구조로, 멤버십 검사, 삽입, 삭제를 지원한다. 맵 (Map, Dictionary) 은 키-값 쌍을 저장하며, …

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기