자바에서 가장 많이 사용하는 자료구조 중 하나가 바로 Map입니다. 그중에서도 HashMap과 ConcurrentHashMap은 면접 단골 질문이자, 성능에 직결되는 아주 중요한 주제입니다. 이번에는 두 자료구조의 차이점과 멀티스레드 환경에서 왜 ConcurrentHashMap을 써야 하는지 정리해 보도록 하겠습니다.
01. HashMap과 ConcurrentHashMap 기본 개념
1) HashMap
HashMap은 자바에서 가장 많이 사용하는 Map 구현체입니다. Key-Value 구조로 데이터를 저장하며, 단일 스레드 환경에서 매우 빠른 성능을 제공합니다.
하지만 중요한 단점이 하나 있습니다. 스레드 안전(Thread-Safe)하지 않다는 점입니다.
2) ConcurrentHashMap
ConcurrentHashMap은 이름 그대로 멀티스레드 환경에서 안전하게 사용할 수 있도록 설계된 Map입니다. 여러 스레드가 동시에 put, get, remove를 수행해도 데이터 정합성이 깨지지 않습니다.
02. 내부 동작 방식 차이 : 스레드 안전(Thread-Safe)
두 클래스의 가장 큰 차이는 스레드 안전(Thread-Safe) 여부입니다.
| 구분 | HashMap | ConcurrentHashMap |
| 스레드 안전 (Thread-Safe) | No (안전하지 않음) | Yes (안전함) |
| 동시 put/get | 문제 발생 가능성 있음 | 안전함 |
| null 허용 | Yes (허용됨) | No (허용되지 않음) |
| 성능 | 싱글 스레드에서 매우빠름 | 멀티 스레드에서 최적의 성능 |
1) HashMap
HashMap은 내부적으로 동기화(synchronization)를 전혀 하지 않습니다. 그래서 단일 스레드 환경에서는 매우 빠르지만, 여러 스레드가 동시에 접근하면 구조가 깨질 수 있습니다.
HashMap을 멀티스레드 환경에서 그대로 사용하면 다음과 같은 문제가 발생할 수 있습니다.
- 데이터 누락
- 무한 루프
- 예상치 못한 값 반환
2) ConcurrentHashMap
ConcurrentHashMap은 전체 Map을 한 번에 잠그지 않는 구조로 설계되었습니다.
Java 7 이전에는 세그먼트(segment) 단위로 락을 관리했지만,
Java 8 이후부터는 CAS(Compare And Swap)와 노드 단위 락(Node-level Lock)을 조합한 방식을 사용하여 동시성은 유지하면서도 성능 저하를 최소화합니다.
이 과정에서 다음과 같은 특징을 가집니다.
- 빈 버킷에 대한 최초 삽입은 CAS를 사용해 락 없이 원자적으로 처리
- 이미 노드가 존재하는 경우, 실제로 수정이 필요한 노드(또는 체인)에만 synchronized 적용
- 읽기(get) 연산은 락 없이 수행되고, 쓰기(put, remove) 연산만 최소 범위로 동기화
이러한 구조 덕분에 ConcurrentHashMap은 멀티스레드 환경에서도 데이터 정합성을 유지하면서 높은 처리량을 제공합니다.
03. 무엇을 언제 써야 할까?
싱글스레드 또는 특정 메서드 안에서 잠깐 쓰고 버리는 지역 변수로 사용할때는 HashMap을 사용합니다.
Map<String, String> localMap = new HashMap<>();
localMap.put("key", "value");
멀티스레드 환경 또는 공유자원으로 사용될때는 ConcurrentHashMap을 사용합니다. 웹 서버 환경에서는 기본적으로 ConcurrentHashMap을 고려하는 것이 안전합니다.
Map<String, String> sharedMap = new ConcurrentHashMap<>();
sharedMap.put("key", "value");
04. 마무리 : 주의사항
HashMap +synchronized는 대안이 되지 않을까 생각할 수 있습니다. 결론적으로 가능은 하지만 추천하지 않습니다. 왜냐하면 Map 전체에 락이 걸리기 때문에 동시성이 크게 떨어지기 때문입니다. 멀티스레드 환경에서는 ConcurrentHashMap을 사용하는 것이 훨씬 효율적인 선택입니다.
- HashMap은 빠르지만 스레드 안전하지 않다
- ConcurrentHashMap은 멀티스레드 환경에서 안전하다
- 웹 서버 환경에서는 ConcurrentHashMap이 기본 선택사항이다.
- 성능보다 중요한 건 정합성과 안정성!
HashMap과 ConcurrentHashMap의 차이를 정확히 이해하면, 실무에서 발생하는 수많은 동시성 문제를 미리 예방할 수 있습니다.
cf) HashMap 사용방법은 아래의 링크 글을 참고하세요
[Java] HashMap 사용방법과 꼭 기억해야 할 주의사항 (개념, 특징, 메소드 및 예제)
자바 개발에서 HashMap은 가장 기본이면서도, 실무에서는 의외로 많은 문제가 발생하는 컬렉션입니다.간단한 예제에서는 잘 동작하지만, 실제 서비스 코드에서는 “값이 왜 바뀌었는지 모르겠다
kadosholy.tistory.com
'Java' 카테고리의 다른 글
| [Java] ArrayList 사용방법과 꼭 알아야 할 주의사항 (개념, 특징, 메소드 및 예제) (0) | 2026.02.01 |
|---|---|
| [Java] HashMap Key로 객체를 사용할 때 꼭 알아야 할 equals()와 hashCode() (0) | 2026.01.29 |
| [Java] HashMap 사용방법과 꼭 알아야 할 주의사항 (개념, 특징, 메소드 및 예제) (0) | 2026.01.27 |
| [Java] 자바 설치 및 환경변수 등록하기 (OpenJDK 버전별 다운로드) (1) | 2025.08.02 |
| [Java] 자바 - 멀티채팅 프로그램 구현하기 (0) | 2022.08.10 |
