[Java] ConcurrentSkipListMap
ConcurrentSkipListMap, java.util.concurrent.ConcurrentSkipListMap, skip list map, 동시성 정렬 맵
정의
java.util.concurrent.ConcurrentSkipListMap<K,V> 는 Skip List 기반의 thread-safe 정렬 Map. TreeMap 의 동시성 버전.
ConcurrentHashMap 과의 결정적 차이: 정렬 순서를 유지 + NavigableMap 인터페이스 구현 (floor, ceiling, subMap 등).
Skip List 는 평균 O(log n) 의 균형 트리 대체 자료구조. 락 없이 동시 수정이 가능한 알고리즘이 잘 알려져 있어 동시성 구현에 적합.
시각화
Skip List 의 구조
Level 3: head ─────────────────────► 25 ─────────► null
Level 2: head ────────► 10 ────────► 25 ──► 40 ──► null
Level 1: head ─► 5 ──► 10 ──► 17 ──► 25 ──► 40 ──► null
Level 0: head ─► 5 ──► 10 ──► 17 ──► 25 ──► 33 ── 40 ─► null
↑
실제 데이터 lane
- 각 노드가 확률적으로 여러 레벨에 포함
- 상위 레벨은 “스킵 인덱스” 처럼 작용해 O(log n) 검색
- 새 노드 삽입 시 동전 던지듯 레벨 결정 (1/2 확률로 한 레벨씩 위로)
복잡도
| 작업 | 평균 | 최악 |
|---|---|---|
get, put, remove | O(log n) | O(n) (매우 드뭄, 동전이 다 같은 면) |
firstKey, lastKey | O(1) | O(1) |
containsKey | O(log n) | |
| 순회 | O(n) | |
size() | O(n) | 약함 |
사용 예
시간순 정렬된 동시성 맵
ConcurrentNavigableMap<Instant, Event> log = new ConcurrentSkipListMap<>();
// Producer thread
log.put(Instant.now(), event);
// Consumer thread
NavigableMap<Instant, Event> recent = log.tailMap(Instant.now().minusSeconds(60));
recent.forEach((t, e) -> process(e));
Range 쿼리 + 동시성
ConcurrentNavigableMap<Integer, String> levels = new ConcurrentSkipListMap<>();
levels.put(0, "free");
levels.put(100, "basic");
levels.put(1000, "premium");
// 어느 등급에 해당하는지
String tier = levels.floorEntry(user.points()).getValue();
ConcurrentHashMap vs ConcurrentSkipListMap
| 항목 | ConcurrentHashMap | ConcurrentSkipListMap |
|---|---|---|
| get/put 시간 | O(1) 평균 | O(log n) |
| 순서 | 없음 | 정렬 |
| Range 쿼리 | ✗ | ✓ (subMap 등) |
| floor / ceiling | ✗ | ✓ |
| 동시성 메커니즘 | CAS + 버킷 sync | lock-free skip list |
순서가 중요하지 않으면 ConcurrentHashMap, 정렬/범위 쿼리가 필요하면 ConcurrentSkipListMap.
참고
- Object
- Iterable
- Collection
- Map
- TreeMap
- ConcurrentHashMap
- ConcurrentSkipListSet
- Non-Blocking
- William Pugh, “Skip Lists: A Probabilistic Alternative to Balanced Trees” (CACM 1990)
이 글의 용어 (8개)
- [Java] Collectionjava
- 정의 는 그룹으로 묶인 객체들을 표현하는 최상위 인터페이스. JCF (Java Collections Framework) 의 입구이자, / / / 모두 이를 확장한다. 자체는 직접…
- [Java] ConcurrentHashMapjava
- 정의 는 고동시성 환경에서 사용 가능한 구현. JSR-166 (Java 5) 도입, Java 8 에서 내부 구조가 크게 재작성됐다. 과 같은 인터페이스를 제공하면서 thread-…
- [Java] ConcurrentSkipListSetjava
- 정의 는 을 백킹으로 사용하는 정렬된 thread-safe . 의 동시성 버전. 인터페이스 구현. floor, ceiling, subSet 등 정렬 기반 연산 제공. 복잡도 의 …
- [Java] Iterablejava
- 정의 는 루프로 순회 가능한 모든 타입의 최상위 인터페이스. 단 하나의 추상 메서드, 를 정의한다. 인터페이스가 을 extends 하므로 , , , 등 모든 컬렉션이 자동으로 대…
- [Java] Objectjava
- 정의 는 Java 의 모든 클래스의 최상위 부모 (root) 클래스. 가 명시되지 않은 클래스는 컴파일러가 자동으로 를 붙인다. 인터페이스는 클래스가 아니라 를 직접 상속하지는 …
- [Java] TreeMapjava
- 정의 는 Red-Black Tree 기반의 정렬된 . (확장 인터페이스) 을 구현해 범위 쿼리, floor/ceiling, sub-map 같은 정렬 기반 연산을 제공한다. key…
- 집합과 맵 (Set and Map)algorithm
- 정의 집합 (Set) 은 고유한 원소들의 모임을 나타내는 추상 자료구조로, 멤버십 검사, 삽입, 삭제를 지원한다. 맵 (Map, Dictionary) 은 키-값 쌍을 저장하며, …
- Non-Blocking (논블로킹)concurrency
- 정의 Non-Blocking 은 호출이 결과를 기다리지 않고 즉시 반환 하는 실행 방식. 결과가 준비되지 않았다면 "아직 안 됐다" 라는 신호 ( , , , 등) 를 반환하고, …
💬 댓글