[BE/JAVA] HashTable과 HashMap 그리고 Synchronized

2021. 3. 26. 11:23
728x90
반응형

2021.03.26

11일차

 

입사 20일차.

HashTable은 jdk1.5 버전 출시 이후 ConcurrentHashMap에 밀려버렸고, 개발자들이 만들어 놓은 프로젝트를 보면 HashTable보다는 HashMap을 사용한다. 여러가지 키워드를 가지고 검색을 해보며 Synchronized, Thread-safe 등을 알게 되었고, 그것에 대해 정리하려고 한다.

 

오늘 작성하는 내용들은 전부 검색으로 알게된 내용이기 때문에 각 문단 맨 앞에 출처를 밝힌다.

내가 알아볼 수 있는 정도로만 작성했기 때문에, 자세하고 알고 싶다면 출처를 밝힌 페이지들을 직접 확인해봐야한다.

 

 

1. Synchronized ( = 동기화 )

  ① 출처 : 투덜이의 리얼 블로그 (링크)

  ② 출처 : Chan != * (링크)

   멀티스레드로 동시접근되는 것을 막는다

  Synchronized를 지원하는 객체에 접근하면, 다른 Thread에서 접근할 수 없도록 Synchronized block이 Lock을 건다.

  ⑤ Lock을 걸고 푸는 작업은 많은 시간을 필요로 하는 작업이다.

  ⑥ HashTable은 모든 데이터 입출력에 대해 Synchronized를 지원하기 때문에 HashMap과 속도차이가 발생하게 된다.

 

 

2. int index = (hash & 0x7FFFFFFF) % tab.length;

  ① 출처 : Chan != * (링크)

  ② 출처 : stackoverflow (링크)

   Map Collenction의 메소드들은 for문을 이용해서 Key와 Value를 return한다.

   이때, index를 생성하는 코드가 위의 코드다.

   0x7FFFFFFF은 0111 1111 1111 1111 1111 1111 1111 1111이고, 부호 비트를 제외한 값은 모두 1이다.

   따라서 위의 값은 항상 양의 정수가 되어 에러가 발생하지 않는다.

 

코드를 직접 확인하자

// HashTable의 get 메소드 구조
public Synchronized V get (Object key) {
      Entry tab[] = table;

      // hashCode() = 객체의 주소값을 변환하여 생성한 객체의 고유한 정수값
      // 문자열에서 한글자씩 가져와서 정수값으로 변경 후, 31을 곱한다.
      // String에서 중복가능성이 있기 때문에 최근에는 잘 사용하지 않는다.
      int hash = key.hashCode();

      // index가 항상 양의 정수로 나올 수 있도록 index를 생성한다.
      int index = ( hash & 0x7FFFFFFF ) % tab.length;
      for ( Entry<K, V> e = tab[index]; e! = null; e = e.next ) {
            if ( (e.hash == hash) && e.key.equals(key) ) {
                  return e.value;
            }
      }
}

 

 

3. HashMap, HashSet, HashTable의 공통점

  ① 출처 : Jace'sBlog (링크)

  ② Key-Value로 데이터를 저장하는 자료구조. 

   Key에 Hash함수를 적용하여 고유의 Index를 생성한 후, Index를 활용하여 값을 저장하거나 검색하는 방식이다. 

   Index를 활용하기 때문에 효율적인 데이터 관리 및 빠른 데이터 처리가 가능하고, 시간복잡도는 O(1)이 된다.

 

 

4. HashMap, HashSet, HashTable의 차이점

  ① 출처 : Jace'sBlog (링크)

  ② HashMap<K, V> : Synchronized를 지원하지 않기 때문에 속도가 빠르다. Null을 허용하고 Key값은 중복될 수 없다.

   HashSet<V> :  Null을 허용하고, 중복된 Value를 저장할 수 없다.

   HashTable<K, V> : Synchronized를 지원하기 때문에 속도가 느리다. Null을 허용하지 않는다. 

 

 

ConcurrentHashMap에 대해서도 정리하고 싶지만 사용해본 적이 없어서 지금은 다른 사람의 코드를 봐도 이해할 수가 없다. 이후에 개발할 포폴에서는 ConcurrentHashMap을 사용해보고 내용을 정리해보고 싶다.

728x90
반응형

BELATED ARTICLES

more