알아보기 - ConcurrentHashMap

GGAGURI·2021년 4월 27일
0

스프링을 공부하다가 회원가입 로직을 작성할 때, 무의식적으로 HashMap을 사용하다가 멀티스레드 환경에서 더 나은 방식은 없을까 찾아보다가 ConcurrentHashMap을 알아보았다.

ConcurrentHashMap을 간단히 살펴보면, HashMap의 멀티스레드 환경에서의 동기화처리로 인한 문제점을 보완한 것이다. ConcurrentHashMap은 concurrent multi-threaded 환경에서 안정적으로 동작하고 HashTable과 synchronized map 보다 더 나은 성능을 가지고 있다. 그 이유는, ConcurrentHashMap은 map의 일부에만 lock을 거는데 반해, 앞의 두 가지는 map 전체에 lock을 걸기 때문이다.

동작원리

Concurrency(병행성) 레벨에 기반하여 map을 여러 부분으로 나누고, 업데이트 동작이 일어나는 동안 해당하는 부분에만 lock을 수행한다. 기본 병행성 레벨은 16단계로 즉, 16개의 부분으로 나눠 각에 서로 다른 lock을 수행한다. 결론적으로 16개의 쓰레드가 동시다발적으로 map에 동작을 수행할 수 있게 되는 것.

다만, put(), remove(), putAll(), clear() 등의 명렁어는 동기적으로 수행되기에 map의 최신결과를 반영하지 않을 수 있다. KeySet iterator의 경우에도 주기적으로 동기화 되고 특정한 시점의 상태만을 반영하기 때문에 최근에 변경된 내용은 반영하지 못한다.

HashMap과의 차이점

ConcurrentHashMap의 iterator는 fail-safe하고, ConcurrentModificationException을 발생시키지 않는다. 또한 키와 값에 null값이 허용되지 않으며, 해당하는 경우 NullPointerException 런타임 예외가 발생한다.

어떤 경우에 사용하는 것이 좋을까?

  • 멀티 스레드 애플리케이션
  • 추가/삭제와 같은 갱신작업보다 검색 작업이 많은 경우
    -> ConcurrentHashMap의 검색 작업(get포함)은 Lock이 이루어지지 않으며 갱신작업 (put, remove 포함)과 동시에 수행될 수 있기 때문.
profile
주니어 개발자

0개의 댓글