HashMap의 경우, 동시성 이슈 때문에 멀티쓰레드 환경에서는 사용할 수 없다. Map 인터페이스를 구현한 클래스 중에서 가장 성능이 좋지만, synchronized키워드가 존재하는 다른 클래스의 사용이 필요하다.

Hashtable 클래스의 단점을 보완하면서 Multi-Thread 환경에서 사용할 수 있도록 나온 클래스가 CurrentHashMap이다.

public class ConcurrentHashMap<K,V> extends AbstractMap<K,V>
    implements ConcurrentMap<K,V>, Serializable {

    private static final int DEFAULT_CAPACITY = 16;

    // 동시에 업데이트를 수행하는 쓰레드 수
    private static final int DEFAULT_CONCURRENCY_LEVEL = 16;
}

버킷의 수는동시작업이 가능한 쓰레드의 수이므로, ConcurrentHashMap은 버킷 단위로 lock을 사용하기 때문에 같은 버킷이 아니라면 Lock을 기다릴 필요가 없다.

빈 버킷에 노드를 삽입하는 과정으로 Compare and Swap 방식을 이용한다.(Java내 synchronized외 여러 동기화 방식이 있다)

ConcurrentHashMap은 읽기 작업보다는 쓰기 작업의 성능이 중요한 상황에 적합하게 사용될 수 있다.

Reference