Learning
토픽 59 / 66·동시성 자료구조

ConcurrentHashMap

ConcurrentHashMap

여러 스레드가 동시에 읽기·쓰기 가능한 해시맵으로, 세그먼트 또는 버킷 단위 잠금을 통해 높은 동시성을 제공하며 전체 맵 잠금 없이 확장 가능

목적: 동시성 해시맵, 높은 처리량, 스레드 안전, 확장성

특징: 세그먼트/버킷 락, 읽기 락프리, CAS 활용, 동적 확장

구조(Java 8+): 버킷 배열 + 각 버킷은 연결 리스트/Red-Black 트리 + 버킷 단위 synchronized

동작

  • get: 대부분 락 없음(volatile 읽기), O(1)~O(log n)
  • put: ① 버킷 해시 → ② 버킷이 비어있으면 CAS 삽입 → ③ 충돌 시 버킷 락 획득 → ④ 연결 리스트 또는 트리 삽입
  • resize: 점진적 확장, 다른 스레드도 참여(협력적)

동시성 수준: Java 7 이전 = 16개 세그먼트, Java 8+ = 버킷 단위 락

시간 복잡도: get·put 평균 O(1), 최악 O(log n) - 트리화

공간 복잡도: O(n)

장점: 높은 동시성, 읽기 락프리, 확장성, 스레드 안전, 예측 가능한 성능

단점: 약한 일관성(size() 근사), 복잡한 구현, 메모리 오버헤드

적용사례: Java 멀티스레드 애플리케이션, 캐시, 공유 상태 관리, 웹 서버

비교: ConcurrentHashMap(동시성/버킷락) vs HashMap(단일스레드) vs Hashtable(전체락/느림)

연관: 해시맵, 동시성, CAS, 버킷 락, Java