반응형
HashMap은 기본적으로 멀티스레드 환경에서 안전하지 않은 컬렉션입니다.
여러 스레드가 동시에 데이터를 수정하거나 조회하면 예기치 않은 동작이나 데이터 손실이 발생할 수 있습니다.
이를 방지하기 위해 자바에서는 Collections.synchronizedMap()을 통해
Map을 동기화된 상태로 래핑(wrapping)하여 사용할 수 있도록 지원합니다.
📌 예제 코드
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class SynchronizedMapExample {
public static void main(String[] args) {
Map<Integer, String> map = Collections.synchronizedMap(new HashMap<>());
Thread threadA = new Thread() {
public void run() {
for (int i = 1; i <= 1000; i++)
map.put(i, "내용" + i);
}
};
Thread threadB = new Thread() {
public void run() {
for (int i = 1001; i <= 2000; i++)
map.put(i, "내용" + i);
}
};
threadA.start();
threadB.start();
try {
threadA.join();
threadB.join();
} catch (Exception e) {
// 예외 처리 생략
}
System.out.println("총 객체의 수 : " + map.size());
}
}
💻 실행 결과
총 객체의 수 : 2000
💬 코드 설명
- Collections.synchronizedMap()을 사용하여 HashMap을 스레드 안전하게 동기화합니다.
- 두 개의 스레드(threadA, threadB)가 각각 1000개의 데이터를 맵에 추가합니다.
- join()을 통해 두 스레드의 작업이 완료될 때까지 메인 스레드는 대기하며,
모든 작업이 끝난 후 맵의 크기를 출력합니다. - 만약 동기화를 하지 않고 일반 HashMap을 사용했다면,
데이터 손실이나 충돌이 발생할 가능성이 있습니다.
💡 포인트 정리
- HashMap은 동기화 기능이 없는 비동기 컬렉션입니다.
- Collections.synchronizedMap(Map)을 통해 스레드 안전한 래퍼 객체로 감싸는 방식으로 사용합니다.
- 멀티스레드 환경에서는 ConcurrentHashMap을 사용하는 것이 더 권장되며,
synchronizedMap()은 간단한 동기화 처리에 적합합니다. - 모든 쓰기 작업에 자동으로 synchronized 처리가 되기 때문에 안정성을 보장할 수 있습니다.
📌정리하자면, 멀티스레드 환경에서 HashMap을 그대로 사용할 경우, 데이터 충돌이나 손실이 발생할 수 있습니다.
이를 방지하기 위해 Collections.synchronizedMap()을 활용하면
간단하게 동기화된 Map을 생성할 수 있습니다.
이번 예제에서는 2000개의 데이터를 두 스레드가 동시에 저장했지만,
정확하게 처리되는 결과를 통해 동기화의 효과를 확인할 수 있었습니다.
'Java > 자바 정리' 카테고리의 다른 글
153. 람다식 기초 사용법 – 함수형 인터페이스와 람다 전달 (0) | 2025.05.22 |
---|---|
[Java 컬렉션 핵심 요약] 필수 클래스 개념 + 한 줄 정리로 끝내기 (1) | 2025.05.21 |
152. 불변 컬렉션 생성하기 – List.of(), copyOf(), Set.of() 등 활용 (0) | 2025.05.21 |
150. Queue 컬렉션 – 선입선출 메시지 처리 방식 (0) | 2025.05.21 |
149. Stack 컬렉션 – 후입선출 구조 실습 (2) | 2025.05.21 |
148. TreeSet에 정렬 기준 주입하기 – Comparator 활용 (0) | 2025.05.21 |