Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

개발자이야기

java Hashmap vs Hashtable 본문

JAVA

java Hashmap vs Hashtable

개발자가되고싶어 2021. 8. 3. 00:35
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