You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
하지만 data를 read, write하는 메서드들이 Synchronized 키워드가 붙어 있는 동기화 메서드로 성능적으로 좋지 않습니다.
동시성을 고려하지 않아도 되는 상황 모두에서도 Lock을 걸기 때문입니다.
HashMap
가장 자주 접하게 되는 Key, value 자료구조이지만 Thread-Safe 하지 않기 때문에 멀티스레드 환경에서의 사용은 자제해야합니다.
ConcurrentHashMap
이름에서 부터 확인할 수 있듯이 Thread-safe한 자료구조입니다.
ConcurrentHashMap의 데이터를 삽입하는 put() 메서드의 경우, 기본적으로 데이터를 삽입하고자 할때 원자성을 보장하는 CAS(CompareAndSwap) 메서드를 사용합니다.
하지만 이 경우는 해당 key (or hash값)이 일치하는 Node가 없을 때의 경우로, 삽입하고자하는 해쉬 버킷에 Node가 이미 존재한다면, 해당 버킷을 Lock을 겁니다. (synchronized 블록을 활용)
그렇기 때문에 같은 해쉬 버킷에 접근하는 경우가 아니라면 여러 스레드가 데이터를 읽고, 쓰는 과정에서의 동기화가 보장됩니다.
(이전에도 HashTable보다 동기화 방식에서 효율적이었으나 Java 8에서 위 방식으로 구현이 변경이 되어 성능이 더 좋아졌음)
++ Hash 충돌을 해결하는 방법의 경우 대표적으로 Open Addressing, Separate Chaining 방식 있습니다.
++ Java는 Separate Chaining 방식으로 충돌을 해결합니다.
++ 데이터의 수가 작다면 Open Addressing, 데이터 수가 많다면 Separate Chaining 이 성능적으로 유리합니다.
HashTable vs HashMap vs ConcurrentHashMap
키워드
Thread-Safe
,Synchronized
,Hash 충돌
The text was updated successfully, but these errors were encountered: