Open wlwlwon opened 1 year ago
HashMap | HashTable | ConcurrentHashMap | |
---|---|---|---|
key와 value에 대한 null허용 | O | X | X |
동기화 보장 | X | O | O |
성능 순위 | 1 | 3(전체 메서드에 락) | 2(필요한 부분만 락) |
추천환경 | 잘 사용하지 않음 | 멀티스레드 | 멀티스레드 |
synchronized의 비용
HashMap vs 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) {
// ... 중략 ...
}
HashTable(Collections.synchronizedMap()) vs ConcurrentHashMap
** ConcurrentHashMap
/* ConcurrentHashMap : 꼭 필요한 경우(이미 노드가 존재하는 경우)에만 synchronized를 이용란 lock */
final V putVal(K key, V value, boolean onlyIfAbsent) {
...
else {
V oldVal = null;
synchronized (f) { // <- 동기화
...
}
}
문제
contents - 세부 내용
HashMap의 동시성을 해결하기 위해 collections.synchronizedMap을 사용해 동시성을 해결했는데 ConcurrentHashMap이 등장하면서 어떻게 더 개선된건지 알고싶습니다.
참고
p.290