Java/자바 정리

151. HashMap을 동기화하기 – Collections.synchronizedMap()

코딩하는냥이 2025. 5. 21. 14:36
반응형

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개의 데이터를 두 스레드가 동시에 저장했지만,
정확하게 처리되는 결과를 통해 동기화의 효과를 확인할 수 있었습니다.