반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
Tags
- Maven
- Visual Studio Code
- date
- Eclipse
- windows
- input
- CMD
- Java
- list
- string
- 자바
- 정규식
- ArrayList
- 이클립스
- javascript
- table
- 자바스크립트
- 이탈리아
- json
- js
- IntelliJ
- 테이블
- Button
- 인텔리제이
- html
- 문자열
- Array
- vscode
- CSS
- 배열
Archives
- Today
- Total
어제 오늘 내일
[Java] Collections.synchronizedMap()으로 스레드 안전한 맵 만들기 본문
멀티스레드 환경에서 여러 스레드가 동시에 같은 Map
에 접근하면 문제가 생길 수 있습니다.
예를 들어, 한 스레드가 키-값을 추가하는 동시에 다른 스레드가 값을 삭제한다면 데이터 불일치가 발생할 수 있죠.
이런 상황에서는 맵을 스레드 안전하게 만드는 것이 필요합니다.
이때 Collections.synchronizedMap()
을 사용하면 간단하게 해결할 수 있습니다.
이 메서드는 멀티스레드 환경에서 스레드 안전(Thread-Safe) 한 맵을 만들 때 사용합니다.
1. 기본 사용법
import java.util.*;
public class SyncMapExample1 {
public static void main(String[] args) {
Map<String, String> normalMap = new HashMap<>();
Map<String, String> syncMap = Collections.synchronizedMap(normalMap);
syncMap.put("KR", "Korea");
syncMap.put("US", "United States");
syncMap.put("JP", "Japan");
System.out.println(syncMap);
}
}
실행 결과
{KR=Korea, US=United States, JP=Japan}
👉 HashMap
을 감싼 스레드 안전 Map이 만들어졌습니다.
2. 동기화된 반복문 사용하기
synchronizedMap
은 put
, get
, remove
같은 메서드는 자동으로 동기화되지만,
반복(iteration) 은 수동 동기화가 필요합니다.
import java.util.*;
public class SyncMapExample2 {
public static void main(String[] args) {
Map<Integer, String> map = Collections.synchronizedMap(new HashMap<>());
map.put(1, "apple");
map.put(2, "banana");
map.put(3, "cherry");
// 안전한 반복
synchronized (map) {
for (Map.Entry<Integer, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + " = " + entry.getValue());
}
}
}
}
👉 반복문은 synchronized(map)
블록 안에서 사용해야 합니다.
3. 활용 예시
- 멀티스레드 캐시: 여러 스레드가 동시에 데이터를 읽고 쓸 때
- 공유 상태 관리: 스레드 간 공용 설정값 저장
- 로그 수집: 키-값 형태의 로그 데이터를 여러 스레드에서 동시에 기록
4. 주의할 점
Collections.synchronizedMap()
은 기존 맵을 감싼 래퍼(wrapper) 입니다.- 성능이 중요한 경우에는
ConcurrentHashMap
같은 대안을 고려하는 것이 좋습니다. - 반복(iteration)에서는 반드시 명시적으로 동기화해야 안전합니다.
5. 정리
Collections.synchronizedMap(Map<K, V> map)
👉 주어진 맵을 감싼 스레드 안전 Map 반환- 메서드 호출은 자동 동기화, 반복문은 수동 동기화 필요
- 간단히 동기화 맵을 만들 수 있지만, 고성능 환경에서는
ConcurrentHashMap
권장
👉 멀티스레드 환경에서 안전하게 Map
을 쓰려면 Collections.synchronizedMap()
으로 감싸자!
반응형
'IT > Java' 카테고리의 다른 글
[Java] Collections.synchronizedCollection()으로 아무 컬렉션이나 스레드 안전하게 (0) | 2025.09.10 |
---|---|
[Java] Collections.synchronizedSet()으로 스레드 안전한 집합 만들기 (0) | 2025.09.09 |
[Java] Collections.synchronizedList()로 스레드 안전한 리스트 만들기 (0) | 2025.09.08 |
[Java 기초] Collections.singletonMap()으로 단일 요소 불변 Map 만들기 (0) | 2025.09.08 |
[Java 기초] Collections.singleton()으로 단일 요소 불변 Set 만들기 (0) | 2025.09.07 |
Comments