💡 개요
클린코드 책의 동시성 파트에서 ConcurrentHashMap이 HashMap보다 빠르다고 나와있다.
어..? 왜..?
🛠️ ConcurrentHashMap
[개발 일기] 2025.04.26 - Collections.synchronizedXXX() vs Concurrent Collections
ConcurrentHashMap과 HashMap의 차이점은 위 글에서 확인할 수 있다.
간략하게 차이점을 정리하면 동기화 지원 여부의 차이이다.
ConcurrentHashMap은 동기화를 지원하기 때문에 멀티스레드 환경에서도 안전하게 동작한다.
하지만 내부에서 동기화 작업을 수행한다면 당연히 동기화 작업을 수행하지 않는 HashMap보다 느려야 하는 게 정상 아닌가??
일단 ConcurrentHashMap의 동기화 원리에 대해 설명해보면, Java 8 이후부터는 Bucket 단위로 Lock을 거는 방식으로 사용된다.
이는 전체 맵을 하나의 락으로 관리하는 것이 아닌, 부분적으로 나누어 락을 걸 수 있도록 설계된 것이다.
🔓 부분 락의 이점
- 동시에 여러 스레드가 서로 다른 영역에 접근 가능
- 병렬 처리의 효율이 높아짐
- 예를 들어, 스레드 A는 키 1에 접근하고, 스레드 B는 키 1000에 접근하는 경우 두 작업이 서로 간섭 없이 병렬로 실행될 수 있음
부분 락의 개념에 대해 간략하게는 알고 있었다.
이러한 점을 ChatGPT에게 물어보니까, HashMap이 더 빠를 수도, 더 느릴 수도 있다고 한다.
그 이유는 다음과 같다.
ConcurrentHashMap은 동기화를 적용했음에도, 세밀한 락 분할과 최적화된 알고리즘 덕분에 멀티스레드 환경에서 HashMap보다 더 빠를 수 있다.
하.. 약간 아리까리하다. (ChatGPT를 맹신하면 안되니까..!)
대부분의 애플리케이션이 멀티스레드를 사용하니까 뭐 HashMap보다 빠를 수 있을 듯 하다..
아마 ConcurrentHashMap가 더 빠르다는 내용이 나온 파트가 동시성과 관련된 부분이라서 멀티스레드 환경을 고려하여 설명한 내용인 것 같다.
'개발 일기' 카테고리의 다른 글
[개발 일기] 2025.05.21 - 점진적인 개선 (Feat : 클린코드) (0) | 2025.05.21 |
---|---|
[개발 일기] 2025.05.20 - XSS (0) | 2025.05.20 |
[개발 일기] 2025.05.18 - Spring Flux을 많이 사용하지 않는 이유? (0) | 2025.05.18 |
[개발 일기] 2025.05.17 - 비동기와 멀티스레딩? (1) | 2025.05.17 |
[개발 일기] 2025.05.16 - PSA (Portable Service Abstraction) (0) | 2025.05.16 |