- Java의 Map 인터페이스는 <Key, Value>로 구성된 인터페이스입니다.
Map 인터페이스는 여러 구현 클래스를 갖는데,
그 중에서 대표적인 것이 HashMap, HashTable, ConcurrentHashMap 입니다.
이번 글에서는 위의 3가지 구현 클래스들을 비교해보도록 하겠습니다.
1) HashMap
- HashMap의 주요한 특징은 2가지입니다.
(1) null 값을 저장할 수 있다.
(2) 스레드 안전하지 않다는 점입니다.
HashMap이 스레드 안전하지 않다는 것은 HashMap의 메소드들(ex)put, get...)이
따로 synchronized 처리가 되지 않았다는 것을 의미합니다.
따라서 HashMap은
(1) 싱글 스레드 환경에서 사용해야 하며, 멀티 스레드 환경에서 사용하기에는 부적합하고
(2) 속도가 HashTable과 ConcurrentHashMap에 비해 빠릅니다.
2) HashTable
- HashTable의 주요한 특징은 2가지입니다.
(1) null 값을 저장할 수 없다.
(2) 스레드 안전하다.
즉, HashTable의 특징은 HashMap의 특징과 상반됩니다.
HashTable이 스레드 안전하다는 것은 HashTable의 메소드들이
따로 synchronized 처리가 되어 있다는 것을 의미합니다.
따라서 HashTable은
(1) 멀티 스레드 환경에서 사용하기에 적합합니다.
(2) 스레드 간 동기화 작업으로 인해 느립니다.
3) ConcurrentHashMap
- ConcurrentHashMap은 HashMap의 단점(스레드 안전하지 않음)을 보완하기 위해
고안된 클래스입니다.
즉, ConcurrentHashMap은 스레드 안전합니다.
다만, ConrcurrentHashMap은 HashTable과는 다르게 어떤 Entry를 다루는 경우 해당 Entry에만 락을 겁니다.
따라서 HashTable에 비해 속도가 빠릅니다.
4) 결론
- 결론적으로 3개의 클래스를 비교하면 다음과 같습니다.
HashMap | HashTable | ConcurrentHashMap | |
스레드 안전성 | X | O | O |
속도 | 제일 빠름 | 제일 느림 | 보통 |
- 따라서 성능과 안전성을 동시에 고려하면,
싱글 스레드 환경에서는 HashMap 클래스를,
멀티 스레드 환경에서는 ConcurrentHashMap 클래스를 사용하는 것이 가장 적합합니다.
참고
HashMap vs HashTable vs ConcurrentHashMap (techcourse.co.kr)
'Java' 카테고리의 다른 글
자바 가비지 컬렉션(1) (0) | 2022.08.11 |
---|---|
자바에서 소스 코드가 실행되는 과정 (0) | 2022.08.10 |
자바 스레드(1) (0) | 2022.08.06 |
CheckedException vs UncheckedException (0) | 2022.08.03 |
자바 float과 double 자료형 (0) | 2022.07.31 |