record logo record

이번 포스팅에서는 thread환경에서 HashMap사용에 대해서 알아보겠습니다.

Thread-Safe 란?

동기화(Synchronize) 라고 표현하기도 하며 어떠한 Class의 인스턴스가 여러개의 Thread에서 동시 참조되고 해당 객체에 Operation 이 발생해도 정합성을 유지해줄때 보통 우리는 Thread-Safe 하다 라고 표현한다.

HashMap는 thread-safe한가?

결론 부터 말하자면 HashMap은 thread-safe하지 않다. 이유는 여러 스레드가 동일한 HashMap 객체에 액세스하고 HashMap(put(), remove() 메서드) 구조를 수정하려고 하면 HashMap의 상태가 일치하지 않을 수 있기 때문입니다.

HashMap을 멀티 스레드 환경에서 사용하려면 동기화된 블록 내에 동기화(Synchronize)된 블록 내에 관련 코드를 작성하거나 외부 잠금 구현을 사용해야합니다. 그러나 이 경우 적절한 주의를 기울이지 않으면 오류 및 교착 상태 상황이 발생할 가능성이 높습니다.

따라서, HashMap은 멀티 스레드 환경에서는 사용하지 않는 것이 좋습니다. 대신 HashMap과 비슷한 thread-safe한 컬렉션은 다음과 같이 있습니다.

3개 모두 thread-safe 합니다. 그 중 ConcurrentHashMap 는 나머지 두 개보다 더 나은 성능을 제공합니다.

HashTable

Collections.SynchronizedMap

import java.util.*;
 
public class SynchronizedMapTest {
   public static void main(String[] args) {
    // create HashMap
    Map<String,String> map = new HashMap<>();

    map.put("1","a"); 
    map.put("2","b");
    map.put("3","c");
        
    // create a synchronized map
    Map<String,String> syncmap = Collections.synchronizedMap(map);
        
    System.out.println("Synchronized map is : "+syncmap);
   }
}

ConcurrentHashMap

import java.util.concurrent.ConcurrentHashMap;
 
public class ConcurrentHashMapTest {
   public static void main(String[] args) {
    // create ConcurrentHashMap
    Map<String,String> map = new ConcurrentHashMap<>();

    map.put("1","a"); 
    map.put("2","b");
    map.put("3","c");
   }
}

정리

java-difference_hashmap_thread_safe

References