Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

3 Weeks - [HashTable vs ConcurrentHashMap] #54

Open
wlwlwon opened this issue Aug 27, 2023 · 1 comment
Open

3 Weeks - [HashTable vs ConcurrentHashMap] #54

wlwlwon opened this issue Aug 27, 2023 · 1 comment

Comments

@wlwlwon
Copy link
Collaborator

wlwlwon commented Aug 27, 2023

문제

  • HashTable과 ConcurrentHashMap은 Thread-Safe하다는 특성을 가지고 있습니다.
  • 둘 사이의 동작방식에 어떤 차이가 있는건가요?
  • 둘 사이에 어떤 것이 성능이 우수한가요?

contents - 세부 내용

HashMap의 동시성을 해결하기 위해 collections.synchronizedMap을 사용해 동시성을 해결했는데
ConcurrentHashMap이 등장하면서 어떻게 더 개선된건지 알고싶습니다.

참고

p.290

@hgene0929
Copy link
Collaborator

hgene0929 commented Aug 31, 2023

이슈사항

답변

  1. 요약
HashMap HashTable ConcurrentHashMap
key와 value에 대한 null허용 O X X
동기화 보장 X O O
성능 순위 1 3(전체 메서드에 락) 2(필요한 부분만 락)
추천환경 잘 사용하지 않음 멀티스레드 멀티스레드
  1. synchronized의 비용
  • 자바 내부적으로 메서드나 변수를 동기화하기 위해 lock or unlock 처리를 수행한다.
  • 이때, 이런 처리들이 너무 많아지게 된다면, 오히려 프로그램 성능저하를 일으킨다.
  1. 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) { // <- 동기화
            ...
        }
}

@devjy39 devjy39 closed this as completed Sep 8, 2023
@devjy39 devjy39 reopened this Dec 26, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants