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

[Java] ConcurrentSkipListMap

· 수정 · 📖 약 1분 · 328자/단어 #java #concurrent #map #skip-list #sorted #lock-free
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, removeO(log n)O(n) (매우 드뭄, 동전이 다 같은 면)
firstKey, lastKeyO(1)O(1)
containsKeyO(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

항목ConcurrentHashMapConcurrentSkipListMap
get/put 시간O(1) 평균O(log n)
순서없음정렬
Range 쿼리✓ (subMap 등)
floor / ceiling
동시성 메커니즘CAS + 버킷 synclock-free skip list

순서가 중요하지 않으면 ConcurrentHashMap, 정렬/범위 쿼리가 필요하면 ConcurrentSkipListMap.

참고

이 글의 용어 (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 은 호출이 결과를 기다리지 않고 즉시 반환 하는 실행 방식. 결과가 준비되지 않았다면 "아직 안 됐다" 라는 신호 ( , , , 등) 를 반환하고, …

이 개념을 다룬 위키 페이지 (2)

💬 댓글

사이트 검색 / 명령어

검색

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