회사 선임님이 ConcurrentHashMap
를 사용하셔서 궁금해서 찾아본김에 바로 정리쓰
ConcurrentHashMap
- HashMap을 thread-safe 하도록 만들어진 클래스
- key, value에 null을 허용하지 않음
putIfAbsent 메소드 존재
putIfAbsent()
- key 값이 존재하면 기존 값 반환, 아니면 해당 값을 저장한 뒤 반환
다른 비슷한 자료구조들은 어떨까?
Hashtable get(), put() 메소드
public synchronized V get(Object key) {
...
}
public synchronized V put(K key, V value) {
...
}
- 메소드 레벨에서 synchronized를 사용한다.
위처럼 메소드 레벨에서 synchronized를 사용하면 Lock의 매개체가 자기 자신이된다.
이로 인해 전체적인 성능 저하
를 가져올 수 있다.
HashTable의 경우 모든 Data 변경 메소드는 syncronized
로 선언되어 있어 data 무결성
을 보장해준다.
하지만, 동기화된 메소드로 구성되어 있어 멀티 스레드가 동시에 해당 메소드를 실행할 수 없다.
따라서 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제가 가능하다.
HashMap 메소드
public V get(Object key) {
...
}
public V put(K key, V value) {
...
}
- synchronized가 없다.
HashMap의 경우 동기화가 이루어지지 않아 엔트리의 사이즈가 비정상적으로 나오게된다.
HashMap을 사용 할 경우 synchronized
를 선언해 동기화 처리를 반드시 해줘야 한다.
- 싱글 스레드 환경에 적합
- 속도는 빠르지만 신뢰성, 안정성은 떨어진다.
그럼에도 불구하고 동기화 락 자체가 매우 느린 동작이기 때문에, HashTable보다 HashMap이 훨씬 빠르다.
그래서 HashMap을 syncronized하게 사용하거나, concurrentHashMap
을 사용하는 것이 좋을 것 같다.
'자료구조' 카테고리의 다른 글
동적 프로그래밍 기초 - 피보나치 수열(메모제이션) (0) | 2020.03.17 |
---|---|
[자료구조] 우선순위 큐(PriorityQueue) + 힙(Heap) - 2 (0) | 2019.05.13 |
[자료구조] 우선순위 큐(PriorityQueue) -1 (0) | 2018.11.02 |
[자료구조] 자바 Map 총정리 (2) | 2018.09.28 |
큐 (0) | 2018.07.17 |
댓글