728x90
반응형
ConcurrentHashMap은 Java에서 멀티스레드 환경에서 안전하게 사용될 수 있도록 설계된 해시맵 구현체입니다. 다음은 ConcurrentHashMap의 주요 특징입니다:
- 동시성 제공:
- ConcurrentHashMap은 멀티스레드 환경에서 여러 스레드가 동시에 데이터를 읽고 수정할 수 있도록 설계되었습니다.
- 내부적으로 분할 잠금(Shard Locking) 메커니즘을 사용하여 성능을 최적화합니다. 이는 맵이 여러 개의 세그먼트(segment) 로 나뉘어 각 세그먼트에 대해 개별적으로 잠금을 걸기 때문에, 여러 스레드가 동시에 다른 세그먼트를 수정할 수 있습니다.
- 잠금 수준 최적화:
- HashTable처럼 전체 맵에 대해 잠금을 걸지 않고, 데이터의 특정 버킷(bucket) 단위에만 잠금을 걸기 때문에 동시성에서 더 좋은 성능을 발휘합니다.
- Java 8 이후부터는 CAS(Compare-And-Swap) 와 스레드 안전한 배열 구조 등을 사용해 잠금의 필요성을 줄이고, 성능을 향상시켰습니다.
- 쓰기 작업의 동시성:
- put(), remove(), compute() 등의 쓰기 작업 시에는 일부 버킷에 대해 잠금을 걸어 해당 영역에서만 동시성 문제를 방지합니다.
- 이는 스레드 간의 경합을 줄여 성능을 크게 향상시키며, 동시성 높은 환경에서도 안정적으로 사용할 수 있습니다.
- 읽기 작업의 무잠금:
- 대부분의 읽기 작업(get()) 은 잠금을 걸지 않고 수행할 수 있습니다. 이는 읽기 연산이 빈번하게 발생하는 상황에서 큰 장점을 제공합니다.
- Null 허용하지 않음:
- ConcurrentHashMap은 key와 value 모두 null을 허용하지 않습니다. 이는 null 값을 처리하는 과정에서 발생할 수 있는 NullPointerException 등의 잠재적인 문제를 방지하기 위함입니다.
- 포괄적인 동시성 API:
- ConcurrentHashMap은 다양한 동시성 작업을 수행할 수 있도록 여러 메서드를 제공합니다. 예를 들어, compute(), merge(), putIfAbsent() 등을 통해 동시성 하에서도 데이터를 안전하게 업데이트 할 수 있습니다.
- 성능 및 확장성:
- ConcurrentHashMap은 읽기-쓰기 경합(read-write contention) 을 줄이기 위해 내부적으로 최적화되어 있으며, 이를 통해 멀티스레드 환경에서 높은 성능과 확장성을 제공합니다.
- Java 8에서는 bucket 대신 트리화된 구조 (TreeNode)를 사용해 많은 항목이 동일한 해시코드로 해시된 경우 성능이 저하되는 것을 방지하였습니다.
이러한 특징들 덕분에 ConcurrentHashMap은 멀티스레드 환경에서 안전하게 공유 데이터를 관리할 수 있는 매우 유용한 자료 구조로 사용됩니다.
728x90
반응형
'개발중 > Java' 카테고리의 다른 글
Java 개발자라면 알아야하는 질문들이라길래 나는 잘 알고 있는가 ? (0) | 2023.08.07 |
---|---|
[Java] 객체 매핑 라이브러리 ModelMapper (0) | 2023.03.22 |
[JAVA] 문자열 받고, 초성으로 반환해주자. (0) | 2023.01.25 |
[Gson] String => Object Array 활용하기 (0) | 2022.11.29 |
65279 아스키코드가 나와서 문자열 비교 안됨 ?! 😅 (1) | 2022.10.19 |