어제 오늘 내일

[Java] Collections.synchronizedMap()으로 스레드 안전한 맵 만들기 본문

IT/Java

[Java] Collections.synchronizedMap()으로 스레드 안전한 맵 만들기

hi.anna 2025. 9. 9. 01:56

멀티스레드 환경에서 여러 스레드가 동시에 같은 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. 동기화된 반복문 사용하기

synchronizedMapput, 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()으로 감싸자!

 

 

반응형
Comments