반응형
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개의 데이터가 보존되는 결과를 확인할 수 있었습니다.
멀티스레드 환경에서 안전하게 데이터를 공유하려면 반드시 동기화가 적용된 컬렉션을 사용하는 습관이 중요합니다.
'Java > 자바 정리' 카테고리의 다른 글
147. TreeSet과 Comparable – 사용자 정의 객체 정렬하기 (0) | 2025.05.21 |
---|---|
146. TreeMap으로 정렬과 구간 검색하기 (1) | 2025.05.21 |
145. TreeSet으로 정렬과 범위 검색하기 (0) | 2025.05.21 |
143. 키-값 쌍을 저장하는 HashMap – 중복 처리와 순회 방법 (0) | 2025.05.20 |
142. HashSet에서 요소를 안전하게 제거하는 방법 – Iterator 활용 (0) | 2025.05.20 |
141. 사용자 정의 객체의 중복 비교 – hashCode()와 equals() 재정의 (0) | 2025.05.20 |