HashMap은 여러 스레드가 동시에 접근할 때 문제를 일으킬 수 있다는 사실 알고 계시나요??🤔
멀티스레드 환경에서 안전하게 사용할 수 있는 해시맵 구현체 ConcurrentHashMap에 대해 알아보겠습니다.

ConcurrentHashMap 이란?
ConcurrentHashMap은 자바 컬렉션 중 하나로, 여러 스레드가 동시에 안전하게 데이터를 읽고 쓸 수 있도록 설계된 해시맵입니다.
일반적인 HashMap과 달리 멀티스레드 환경에서 동기화 문제를 해결해 줍니다.
멀티스레드 환경에서 여러 스레드가 동시에 데이터를 수정하려고 하면, 데이터가 엉키거나 손실될 수 있습니다.
이를 해결하기 위해 HashMap 대신 ConcurrentHashMap을 사용합니다.
기본 동작 방식
ConcurrentHashMap은 내부적으로 여러 개의 분할 Lock을 사용합니다.
각 Lock은 해시맵의 일부에만 적용되어, 여러 스레드가 동시에 다른 부분을 수정할 수 있게 합니다.
이렇게 하면 전체 맥에 Lock을 거는 것보다 효율적입니다!
import java.util.concurrent.ConcurrentHashMap;
import java.util.Map;
public class ConcurrentHashMapExample {
public static void main(String[] args) {
// ConcurrentHashMap 생성
Map<String, Integer> map = new ConcurrentHashMap<>();
// 여러 스레드가 동시에 데이터를 추가
Runnable task1 = () -> {
for (int i = 0; i < 1000; i++) {
map.put("key" + i, i);
}
};
Runnable task2 = () -> {
for (int i = 1000; i < 2000; i++) {
map.put("key" + i, i);
}
};
Thread thread1 = new Thread(task1);
Thread thread2 = new Thread(task2);
// 스레드 실행
thread1.start();
thread2.start();
// 두 스레드가 작업을 마치기를 기다림
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
// ConcurrentHashMap의 크기 출력
System.out.println("Map size: " + map.size()); // 예상 결과: 2000
}
}
이 예제에서 두 스레드는 동시에 ConcurrentHashMap에 데이터를 추가합니다.
각 스레드는 고유한 키를 사용하여 중복 없이 데이터를 삽입합니다.
최종적으로 맵의 크기는 2000이 됩니다.
주요 메서드
HashMap과 거의 동일하지만 ConcurrentHashMap은 동시성 제어를 위해 내부적으로 Lock을 사용하여 안전하게 작동합니다.
- put(key, value): 맵에 키와 값을 추가합니다.
- get(key): 키에 해당하는 값을 가져옵니다.
- remove(key): 키에 해당하는 값을 제거합니다.
- containsKey(key): 키가 존재하는지 확인합니다.
장점과 단점
장점
- 동시성
여러 스레드가 동시에 안전하게 접근할 수 있습니다. - 성능
내부적으로 Lock을 분할하여 전체 Lock보다 성능이 뛰어납니다. - 안전성
멀티스레드 환경에서 데이터 무결성을 유지합니다.
단점
- 복잡성
내부 구현이 복잡하여, 일반적인 HashMap보다 메모리 사용량이 많을 수 있습니다. - 부분적 락
여러 스레드가 동시에 같은 부분을 수정하려고 하면 성능 저하가 발생할 수 있습니다.
💡 ConcurrentHashMap은 멀티스레드 환경에서 데이터 무결성을 유지하면서도 높은 성능을 제공하는 자료구조입니다.
여러 스레드가 동시에 데이터를 수정하거나 읽는 상황에서 HashMap 대신 ConcurrentHashMap을 사용하면 안전하고 효율적인 데이터를 처리할 수 있습니다.
'Backend > Java' 카테고리의 다른 글
| [Java] 일급 컬렉션(First-Class Collection)이란? (0) | 2024.07.31 |
|---|---|
| [Java] 객체 지향 설계(Object-Oriented Design, OOD) (0) | 2024.07.28 |
| [Java] computeIfAbsent 효율적인 데이터 캐싱과 값 처리 (0) | 2024.07.27 |
| [Java] abstract class 와 interface class의 차이 (0) | 2024.07.17 |
| [Java] of와 from 메서드의 차이 (0) | 2024.07.04 |