본문 바로가기
자료구조

[자료구조] ConcurrentHashmap, HashMap, HashTable

by 코리늬 2019. 12. 29.

회사 선임님이 ConcurrentHashMap를 사용하셔서 궁금해서 찾아본김에 바로 정리쓰

ConcurrentHashMap

  • HashMap을 thread-safe 하도록 만들어진 클래스
  • key, value에 null을 허용하지 않음
  • putIfAbsent 메소드 존재

putIfAbsent()

  • key 값이 존재하면 기존 값 반환, 아니면 해당 값을 저장한 뒤 반환

다른 비슷한 자료구조들은 어떨까?

Hashtable get(), put() 메소드

public synchronized V get(Object key) {
    ...
}

public synchronized V put(K key, V value) {
   ...
}
  • 메소드 레벨에서 synchronized를 사용한다.

위처럼 메소드 레벨에서 synchronized를 사용하면 Lock의 매개체가 자기 자신이된다.

이로 인해 전체적인 성능 저하를 가져올 수 있다.

HashTable의 경우 모든 Data 변경 메소드는 syncronized로 선언되어 있어 data 무결성을 보장해준다.

하지만, 동기화된 메소드로 구성되어 있어 멀티 스레드가 동시에 해당 메소드를 실행할 수 없다.

따라서 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제가 가능하다.

HashMap 메소드

public V get(Object key) {
    ...
}

public V put(K key, V value) {
    ...
}
  • synchronized가 없다.

HashMap의 경우 동기화가 이루어지지 않아 엔트리의 사이즈가 비정상적으로 나오게된다.

HashMap을 사용 할 경우 synchronized를 선언해 동기화 처리를 반드시 해줘야 한다.

  • 싱글 스레드 환경에 적합
  • 속도는 빠르지만 신뢰성, 안정성은 떨어진다.

그럼에도 불구하고 동기화 락 자체가 매우 느린 동작이기 때문에, HashTable보다 HashMap이 훨씬 빠르다.

그래서 HashMap을 syncronized하게 사용하거나, concurrentHashMap을 사용하는 것이 좋을 것 같다.

댓글