CS

ConcurrentHashMap

baek-dev 2025. 5. 19. 13:23

ConcurrentHashMap이란?

ConcurrentHashMap 은 Java에서 제공하는 멀티스레드-safe한 해시 맵(Map) 구현체임.
동시에 여러 스레드가 데이터를 읽거나, 추가하거나, 수정하거나, 삭제해도 안전하게 작동하도록 설계되었음.


1. 왜 필요한가?

기본적인 HashMap 은 동기화 기능이 없기 때문에 멀티스레드 환경에서 사용할 경우 데이터 충돌(레이스 컨디션)이 발생함.
예:

Map<String, String> map = new HashMap<>();

Runnable task = () -> map.put("key", "value");
  • 위 코드를 여러 스레드에서 동시에 실행하면 데이터가 유실되거나 예외가 발생할 수 있음
  • 이를 해결하기 위해 ConcurrentHashMap을 사용함

2. 구조적 특징 (Java 8 기준)

핵심 특징:

  • 내부 구조는 배열 + 연결 리스트 + 트리 로 구성됨
  • 버킷(bucket) 단위로 락을 걸어, 전체 락이 아닌 부분 락(segmental lock) 으로 처리함
  • Java 8부터는 세그먼트 기반 구조 → CAS + Synchronized 방식으로 개선되어 성능 향상됨

3. 주요 동작 원리

연산 방식
get() 동기화 없이 동작 (lock-free, 매우 빠름)
put() / remove() 해당 버킷에만 synchronized 블록으로 락 적용
compute() / merge() 내부적으로 동기화 처리되어 스레드 안전 보장
size() 정확한 값을 얻기 위해선 비용이 큼 (이유: 병렬 구조)

→ 전체 Map에 락을 걸지 않고 일부 영역만 락을 거므로 높은 성능 유지가 가능함


4. 사용 예시

ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();

map.put("apple", 3);
map.put("banana", 5);

int appleCount = map.get("apple");

멀티스레드 환경에서 put(), get(), remove() 모두 안전하게 동작함


5. 원자적 연산 메서드

ConcurrentHashMap 은 여러 유용한 원자 연산 메서드를 제공함

map.computeIfAbsent("apple", k -> 1);
map.compute("apple", (k, v) -> v + 1);
map.merge("apple", 2, Integer::sum);
  • computeIfAbsent: 값이 없을 때만 계산
  • compute: 기존 값을 기준으로 연산
  • merge: 값이 있으면 병합, 없으면 삽입

→ synchronized 없이도 스레드 안전하게 값을 변경할 수 있음


6. 동기화 전략 비교

Map 종류 동기화 방식 성능 스레드 안정성
HashMap 동기화 없음 빠름 ❌ 위험함
Collections.synchronizedMap() 전체 맵에 락 느림 ✅ 보장
ConcurrentHashMap 세분화된 락, 일부 lock-free 빠름 ✅ 보장

7. 유의사항

  • null key, value 허용 ❌ (put(null, x) 또는 put(x, null) → 예외 발생)
  • 전체 size()는 정확하지 않을 수 있음 → mappingCount() or 반복 탐색 필요
  • 순차성을 기대할 수 없음 → LinkedHashMap과 같은 순서 유지 불가

8. 실무에서의 사용 사례

사용 예 설명
사용자별 세션 저장 로그인 사용자 상태를 서버 메모리에서 관리
동시성 캐시 처리 여러 스레드가 같은 데이터를 동시에 요청할 때 안전한 저장소 역할
API 요청 횟수 제한 IP별 요청 수를 원자적으로 카운팅
실시간 키워드 집계 키워드별 카운트 집계 시 race condition 방지

정리

ConcurrentHashMap 은 Java의 멀티스레드 환경에서 안전하게 사용할 수 있는 고성능 맵 자료구조임.
버킷 단위의 락과 lock-free 구조로 높은 동시성 처리 성능을 제공하며,
다양한 원자적 연산 메서드를 통해 안전하게 값 수정이 가능함.
단, null 허용 불가와 일부 메서드의 정확도 이슈에 유의해야 함.

 

 

 

 

출처 : ChatGPT

'CS' 카테고리의 다른 글

분산락  (0) 2025.05.15
임계구역  (0) 2025.05.14
Gof 디자인 패턴  (0) 2025.05.13
세션  (0) 2025.05.11
쿠키  (0) 2025.05.10