Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바 HashMap과 ConcurrentHashMap의 핵심 차이점 완벽 비교

자바 컬렉션과 Map의 이해

자바(Java)에서 컬렉션(Collections) 프레임워크는 데이터를 저장하고 관리하는 가장 핵심적인 자료구조입니다. 컬렉션에는 Map, Set, List 등 다양한 구현체가 있으며, 이들은 데이터 저장을 효율적으로 만들어줄 뿐만 아니라 멀티스레드 환경에서도 안정적인 데이터 처리를 가능하게 해줍니다.

여러 컬렉션 구현체 중 HashMap은 데이터를 키(Key)와 값(Value) 쌍으로 저장하는 대표적인 자료구조입니다. 반면 멀티스레딩 환경을 위해 설계된 ConcurrentHashMap은 HashMap의 장점을 그대로 유지하면서도 스레드 안전성(Thread Safety)까지 보장하는 동시성 컬렉션입니다.

HashMap vs ConcurrentHashMap 주요 차이점

두 컬렉션의 내부 구현 방식을 기준으로 한 핵심 차이점을 아래 표에서 확인할 수 있습니다.

번호구분HashMapConcurrentHashMap
1동시성스레드에 안전하지 않아(Thread-safe하지 않음) 멀티스레드 환경에서는 별도의 동기화 처리가 필요합니다.스레드에 안전하게 설계되어 멀티스레드 환경에서 바로 사용할 수 있습니다.
2내부 구현세그먼트(Segment) 개념이 없으며, 데이터를 키-값 쌍으로 단일 구조에 저장합니다.초기화 시 기본적으로 16개의 세그먼트로 분할되며, 최대 16개의 스레드가 서로 다른 세그먼트에 동시에 접근해 작업할 수 있습니다.
3도입 시기JDK 1.2에서 처음 도입되었습니다.SUN 마이크로시스템즈가 JDK 1.5에서 도입했습니다.
4null 허용 여부키와 값 모두 null을 허용합니다.키와 값 모두 null을 허용하지 않으며, null을 저장하려고 하면 런타임 예외인 NullPointerException이 발생합니다.
5동기화 방식동기화 처리가 없어 구조가 단순하고 단일 스레드 환경에서 빠른 성능을 보입니다.동시성 수준(Concurrency Level)에 따라 맵 전체를 여러 파티션으로 나누고, 맵 전체가 아닌 해당 영역만 잠금(Locking)하여 스레드 안전성을 확보합니다.
6성능Collections.synchronizedMap(HashMap)으로 감싸면 Hashtable과 거의 동등한 동기화된 컬렉션을 얻을 수 있지만, 모든 수정 연산마다 맵 객체 전체에 잠금이 걸려 성능 저하가 발생합니다.동기화된 맵이 필요한 상황이라면 ConcurrentHashMap이 더 나은 선택입니다. 여러 스레드가 동시에 맵에 접근할 수 있어 전반적인 성능이 향상됩니다.

어떤 것을 선택해야 할까?

단일 스레드 환경이라면 동기화 오버헤드가 없는 HashMap이 가장 적합합니다. 반면 여러 스레드가 동시에 맵에 접근하는 환경에서는 Hashtable이나 Collections.synchronizedMap()처럼 맵 전체를 잠그는 방식보다, 부분 잠금을 통해 높은 동시성을 제공하는 ConcurrentHashMap을 사용하는 것이 성능과 안전성 모든 면에서 유리합니다.

참고: Java 8부터 ConcurrentHashMap은 더 이상 세그먼트 기반 구조를 사용하지 않고, CAS(Compare-And-Swap) 연산과 synchronized 블록을 활용한 버킷 단위 잠금 방식으로 내부 구조가 개선되어 더욱 향상된 동시성 성능을 제공합니다.