본문 바로가기

개발중/Java

[JAVA] ConcurrentHashMap 에 대해서

728x90
반응형

ConcurrentHashMap은 Java에서 멀티스레드 환경에서 안전하게 사용될 수 있도록 설계된 해시맵 구현체니다. 다음은 ConcurrentHashMap의 주요 특징입니다:

  1. 동시성 제공:
    • ConcurrentHashMap은 멀티스레드 환경에서 여러 스레드가 동시에 데이터를 읽고 수정할 수 있도록 설계되었습니다.
    • 내부적으로 분할 잠금(Shard Locking) 메커니즘을 사용하여 성능을 최적화합니다. 이는 맵이 여러 개의 세그먼트(segment) 로 나뉘어 각 세그먼트에 대해 개별적으로 잠금을 걸기 때문에, 여러 스레드가 동시에 다른 세그먼트를 수정할 수 있습니다.
  2. 잠금 수준 최적화:
    • HashTable처럼 전체 맵에 대해 잠금을 걸지 않고, 데이터의 특정 버킷(bucket) 단위에만 잠금을 걸기 때문에 동시성에서 더 좋은 성능을 발휘합니다.
    • Java 8 이후부터는 CAS(Compare-And-Swap)스레드 안전한 배열 구조 등을 사용해 잠금의 필요성을 줄이고, 성능을 향상시켰습니다.
  3. 쓰기 작업의 동시성:
    • put(), remove(), compute() 등의 쓰기 작업 시에는 일부 버킷에 대해 잠금을 걸어 해당 영역에서만 동시성 문제를 방지합니다.
    • 이는 스레드 간의 경합을 줄여 성능을 크게 향상시키며, 동시성 높은 환경에서도 안정적으로 사용할 수 있습니다.
  4. 읽기 작업의 무잠금:
    • 대부분의 읽기 작업(get()) 은 잠금을 걸지 않고 수행할 수 있습니다. 이는 읽기 연산이 빈번하게 발생하는 상황에서 큰 장점을 제공합니다.
  5. Null 허용하지 않음:
    • ConcurrentHashMap은 key와 value 모두 null을 허용하지 않습니다. 이는 null 값을 처리하는 과정에서 발생할 수 있는 NullPointerException 등의 잠재적인 문제를 방지하기 위함입니다.
  6. 포괄적인 동시성 API:
    • ConcurrentHashMap은 다양한 동시성 작업을 수행할 수 있도록 여러 메서드를 제공합니다. 예를 들어, compute(), merge(), putIfAbsent() 등을 통해 동시성 하에서도 데이터를 안전하게 업데이트 할 수 있습니다.
  7. 성능 및 확장성:
    • ConcurrentHashMap은 읽기-쓰기 경합(read-write contention) 을 줄이기 위해 내부적으로 최적화되어 있으며, 이를 통해 멀티스레드 환경에서 높은 성능과 확장성을 제공합니다.
    • Java 8에서는 bucket 대신 트리화된 구조 (TreeNode)를 사용해 많은 항목이 동일한 해시코드로 해시된 경우 성능이 저하되는 것을 방지하였습니다.

이러한 특징들 덕분에 ConcurrentHashMap은 멀티스레드 환경에서 안전하게 공유 데이터를 관리할 수 있는 매우 유용한 자료 구조로 사용됩니다.

 
 
728x90
반응형