SSAFY-Book-Study / modern-java-in-action

모던 자바 인 액션 북스터디입니다.
1 stars 10 forks source link

3 Weeks - [HashTable vs ConcurrentHashMap] #54

Open wlwlwon opened 1 year ago

wlwlwon commented 1 year ago

문제

참고

p.290

hgene0929 commented 1 year ago

이슈사항

답변

  1. 요약
HashMap HashTable ConcurrentHashMap
key와 value에 대한 null허용 O X X
동기화 보장 X O O
성능 순위 1 3(전체 메서드에 락) 2(필요한 부분만 락)
추천환경 잘 사용하지 않음 멀티스레드 멀티스레드
  1. synchronized의 비용

    • 자바 내부적으로 메서드나 변수를 동기화하기 위해 lock or unlock 처리를 수행한다.
    • 이때, 이런 처리들이 너무 많아지게 된다면, 오히려 프로그램 성능저하를 일으킨다.
  2. HashMap vs HashTable

    • HashMap은 동기화를 보장하지 않기 때문에 안정성↓, 속도↑.
    • HashTable은 동기화를 보장하기 때문에 안정성↑, 속도↓.
/* HashMap : 동기화를 위한 synchronized 키워드 X */
public V put(K key, V value) {
    return putVal(hash(key), key, value, false, true);
}
public V put(K key, V value) {
    return putVal(hash(key), key, value, false, true);
}

/* HashTable : 동기화를 위한 synchronized 키워드 O */
public synchronized V get(Object key) {
    // ... 중략 ...
}
public synchronized V put(K key, V value) {
    // ... 중략 ...
}
  1. HashTable(Collections.synchronizedMap()) vs ConcurrentHashMap

    • HashTable : 데이터를 다루는 메서드(get(), put(), remove() 등)들에 synchronized 키워드가 선언되어 있다(락이 걸려져 있다).
    • ConcurrentHashMap : 데이터를 다루는 메서드 전체가 아니라, 조작할 데이터에 대해서만 synchronized 키워드를 선언한다(락을 건다). 따라서 HashTable에 비해 속도↑, 그리고 당연히 HashMap에 비해 안정성↑.

    ** ConcurrentHashMap

    • 이미 노드가 존재하는 경우, synchronized를 이용해 하나의 스레드만 접근할 수 있도록 제어한다.
    • 따라서 서로 다른 스레드가 같은 Hash 버킷에 접근할 때만 해당 블록이 잠기게 된다.
/* ConcurrentHashMap : 꼭 필요한 경우(이미 노드가 존재하는 경우)에만 synchronized를 이용란 lock */
final V putVal(K key, V value, boolean onlyIfAbsent) {
    ...
    else {
        V oldVal = null;
        synchronized (f) { // <- 동기화
            ...
        }
}