Java/자바 정리

144. 멀티스레드 환경에서도 안전한 Map – Hashtable 사용법

코딩하는냥이 2025. 5. 20. 14:54
반응형

Hashtable은 자바에서 가장 오래된 Map 구현체 중 하나로,
멀티스레드 환경에서도 데이터를 안전하게 저장할 수 있도록 동기화(Synchronized)가 적용되어 있습니다.
이번 예제는 두 개의 스레드가 동시에 데이터를 저장해도 데이터 손실 없이 정확히 저장되는 구조를 보여줍니다.


📌 예제 코드

import java.util.Hashtable;
import java.util.Map;

public class HashtableExample {
	public static void main(String[] args) {
		Map<String, Integer> map = new Hashtable<String, Integer>();
		
		Thread threadA = new Thread() {
			public void run() {
				for (int i = 1; i <= 1000; i++)
					map.put(String.valueOf(i), i);
			}
		};
		
		Thread threadB = new Thread() {
			public void run() {
				for (int i = 1001; i <= 2000; i++)
					map.put(String.valueOf(i), i);
			}
		};
		
		threadA.start();
		threadB.start();
		
		try {
			threadA.join();
			threadB.join();
		} catch (Exception e) {
			// 예외 처리 생략
		}
		
		System.out.println("총 엔트리 수: " + map.size());
	}
}

💻 실행 결과

총 엔트리 수: 2000

※ 결과는 항상 일정하게 2000이 출력되어야 하며, 동시에 실행된 두 스레드가 각각 1000개의 데이터를 정확히 저장했음을 나타냅니다.


💬 코드 설명

  • Map<String, Integer> 인터페이스를 구현한 Hashtable은 내부적으로 모든 메서드에 동기화(synchronized) 처리가 되어 있어,
    여러 스레드가 동시에 접근하더라도 데이터 충돌이나 손실 없이 안전하게 작동합니다.
  • threadA와 threadB는 각각 "1"~"1000" 및 "1001"~"2000"까지 총 2000개의 키-값 쌍을 저장합니다.
  • join()을 사용하여 두 스레드의 작업이 완료될 때까지 main 스레드가 대기하며,
    모든 작업이 끝난 후 저장된 데이터 수를 출력합니다.

💡 포인트 정리

  • Hashtable은 HashMap과 거의 유사하지만, 모든 작업에 동기화가 걸려 있어 멀티스레드 환경에서 안전합니다.
  • 스레드가 동시에 데이터를 put()해도 손실 없이 처리됩니다.
  • 성능 면에서는 ConcurrentHashMap이 더 우수하여, 실무에서는 대체로 ConcurrentHashMap을 더 많이 사용합니다.
  • 그러나 간단한 예제나 학습 용도로 Hashtable을 사용하면 동기화 Map의 원리를 익히기에 좋습니다.

📌정리하자면, Hashtable은 스레드 동기화를 기본으로 제공하는 안전한 Map 컬렉션입니다.
이번 예제를 통해 여러 스레드가 동시에 데이터를 저장해도 정확하게 2000개의 데이터가 보존되는 결과를 확인할 수 있었습니다.
멀티스레드 환경에서 안전하게 데이터를 공유하려면 반드시 동기화가 적용된 컬렉션을 사용하는 습관이 중요합니다.