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