본문 바로가기
학습

ConcurrentHashMap vs Hashtable vs Synchronized Map

코동이 2022. 10. 15.

개요


멀티쓰레드 자바 어플리케이션에서 Hashtable, Vector는 병목현상이 되었습니다. 따라서 JDK 1.5는 대용량, 짧은 대기 시간에 매우 효율적인 몇 가지 우수한 동시 컬렉션을 도입했습니다

 

3가지 컬렉션이 모두 쓰레드 안전하고 멀티 쓰레드, 동시성 자바 어플리케이션에서 사용합니다. 하지만, 쓰레드 안전 구현에 차이가 있습니다. 

 

 Hashtable은 JDK 1.1에 등장한 레거시 클래스로 동기화 메서드를 사용해 동기화 안전을 보장합니다. Hashtable의 모든 메서드들은 동기화되어 있으므로 쓰레드가 증가할 때마다 느려집니다.


 Synchronized Map은 Hashtable처럼 동시성 자바 프로그램 사용합니다. 하지만 Hastable과 달리 레거시 클래스가 아니고 Collections.synchronizedMap() 메서드를 사용해 어떠한 Map도 동기화된 Map을 만듭니다. 예를 들어, HashMap는 동기화가 되지 않고 쓰레드 안전하지 않기 때문에 Syncrhonized Map을 사용해 쓰레드 안전하며 동기화를 하도록 변경할 수 있습니다.


 ConcurrentHashMap은 1개 이상의 동시성 작업에 사용하려고 만들었습니다. 기본으로 16개의 쓰레드가 어떠한 외부 동기화도 없이 읽기 및 쓰기가 가능합니다. 확장성이 굉장히 뛰어납니다.

ConcurrentHashMap은 Hashtable과 Synchronized Map과 달리 Map 전체 단위로 락을 걸지 않고 Map을 여러 세그먼트로 쪼개서 세그먼트 단위로 락을 겁니다. 

 

 

사진으로 HashMap, HashTable과 ConcurrentHashMap 차이점을 알아보겠습니다.

 

 

HashMap는(HashTable 동일) 버킷(Bucket)에 Key와 Value를 링크드 리스트로 연결합니다. 

HashMap 내부 구조

 

 

ConcurrentHashMap은 각 세그먼트마다 배열을 가지고, 각 인덱스에 동일한 HashMap가 있습니다.(자바 8에서는 기존 링크드 리스트 구조에서 개수가 많아지면 트리를 사용합니다.)

 

참고

https://javarevisited.blogspot.com/2011/04/difference-between-concurrenthashmap.html#axzz7hkM4n200

https://itsromiljain.medium.com/curious-case-of-concurrenthashmap-90249632d335

 

반응형