개발자이야기
java Hashmap vs Hashtable 본문
Hashmap vs Hashtable
HashMap 과 HashTable은 다들 알고 계시듯 key, value 형태로 저장합니다.
하지만 사용법이 궁금해서 해당 포스팅을 방문한 것은 아닐것이라 판단됩니다.
둘의 차이점은 무엇일까요?
우선 결론부터 말씀드리면 Hashmap은 Hashtable의 개선된 버전입니다. 우리는 Hashtable을 쓸 이유가 없습니다.
차이점
1. Hashmap은 동기화가 되지 않으며 Hashtable은 동기화 된다.
2. Hashmap은 하나의 null key 와 여러개의 null value 를 허용하지만 Hashtable은 null이 허용되지 않는다.
위의 내용에서 결국 핵심은 동기화의 여부 입니다. null 문제는 어떠한 방법을 써서든 회피할 수 있다고 생각합니다.
하지만 만약 사용중인 map 객체에 동기화가 필요하다면 어떻게 해야할까요? 그냥 Hashtable을 쓰면 될까요? Hashtable의 동기화는 속도가 느립니다.
다중 스레드에서의 삽입
static class MyThread implements Runnable {
@Override
public void run(){
for (int i=0; i<10000000; i++) {
//Map Put
}
}
}
위의 thread를 활용하여 다중 삽입의 경우 어느정도의 속도 차이를 보이는지 확인 해 보겠습니다.
삽입은 총 1000만번의 반복문을 통해 진행하며, 동시 구동되는 thread의 갯수는 2개 입니다.
총 1000만번의 삽입 지연시간(ms)
참고로 성능 테스트의 경우 pc 환경에 따라 다르며 제가 테스트한 결과가 100% 신뢰할만한 결과는 아니라는 점 참고 부탁드립니다.
그리고 Hashmap의 경우 다중 thread 환경에서 삽입, 수정을 할 경우 예상치 못한 결과가 발생할 수 있습니다. 단순 성능 테스트 인점 참고 부탁드립니다.
Hashmap
단일 스레드 : 평균 1100ms
2개 스레드
- 1번 스레드 : 1100ms
- 2번 스레드 : 1200ms
Hashtable
단일 스레드 : 평균 1100ms
2개 스레드
- 1번 스레드 : 2100ms
- 2번 스레드 : 2200ms
Hashmap의 경우 동기화가 되지 않기때문에 여러개의 스레드에서 삽입을 진행 하여도 시간적으로 크게 딜레이가 생기지 않습니다. 하지만 Hashtable 같은 경우에는 동기화가 되어 진행되기 때문에 두배 가까이 시간이 지연된 것을 확인 할 수 있습니다.
자 이제 두개의 차이점은 대강 알았으니 그럼 다중 thread 환경에서 동기화가 필요하다면 어떤걸 써야 할까요?
ConcurrentHashMap
ConcurrentHashMap 은 Hashtable의 단점을 보완하며 다중 thread 환경에서 사용할 수 있도록 만들어 졌습니다. 사용법 또한 다른 Map interface의 구현체들과 크게 다르지 않습니다.
단일 스레드 : 평균 1500ms
2개 스레드
- 1번 스레드 : 1600ms
- 2번 스레드 : 1700ms
우선 단일 스레드 같은 경우 Hashtable 보다는 성능이 좋지 못한 것을 확인했습니다.
Hashtable과 ConcurrentHashMap의 처리방법이 서로 다릅니다. 간단히 확인을 해 보자면
Hashtable의 경우 put 메소드 자체에 synchronized 키워드가 걸려있는 반면 ConcurrentHashMap의 경우는 빈 노드에 새로운 삽입이 일어날 경우는 synchronized 에 걸리지 않아 lock이 걸리지 않으므로 성능상 유리함을 확보하는 것으로 보입니다. 하지만 단일 스레드에서는 유리함을 확보하지 못하는 것으로 보입니다. 이와 같은 환경에서는 Hashmap을 사용합시다.
직접 테스트 해 보며 작성한 글 입니다. 틀린점은 지적 부탁드리며 읽어주셔서 감사합니다.
'JAVA' 카테고리의 다른 글
Java interface vs abstract(추상클래스) 차이 (0) | 2021.08.11 |
---|---|
Java 메모리 관리 stack 과 heap (0) | 2021.08.05 |
java ArrayList, LinkedList (0) | 2021.07.30 |
java list vs map (0) | 2021.07.27 |
split 예제 (0) | 2016.12.08 |