JAVA/Data Structure

[JAVA] ConcurrentHashMap

빅콜팝 2022. 10. 23. 21:20
728x90
반응형

흔히 사용되는 HashMap 클래스는 synchronized 키워드가 존재하지 않는다.

이는 성능은 좋지만, 멀티스레드 환경에서 thread-safe 하지 않음을 의미하며 멀티스레드 환경에서 사용하기는 부적합하다.

 

 

thread-safe(스레드 안전) : 멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 뜻함.

synchronized : 여러개의 스레드가 한개의 자원을 사용하고자 할 때, 현재 데이터를 사용하고 있는 해당 스레드를 제외하고 나머지 스레드들은 데이터에 접근 할 수 없도록 막는 것을 뜻함.

 

 

이러한 문제로 인해 멀티스레드 환경에서 사용할 수 있도록 나온 클래스가 바로 ConcurrentHashMap 이다.

 

 

docs oracle를 참조해보면,

검색의 전체 동시성과 업데이트에 대한 높은 기대 동시성을 지원하는 해시 테이블이다. 이 클래스는 Hashtable과 동일한 기능 사양을 준수하며, 각 Hashtable 방법에 해당하는 메소드 버전을 포함한다. 그러나 모든 작업이 스레드 안전함에도 불구하고 검색 작업은 잠금을 수반하지 않으며 모든 액세스를 방지하는 방식으로 전체 테이블을 잠글 수 있는 어떠한 지원도 없다. 이 클래스는 동기화 세부 정보가 아닌 스레드 안전성에 의존하는 프로그램에서 해시 테이블과 완전히 상호 운용 가능하다.

 

 

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html

 

ConcurrentHashMap (Java Platform SE 8 )

A hash table supporting full concurrency of retrievals and high expected concurrency for updates. This class obeys the same functional specification as Hashtable, and includes versions of methods corresponding to each method of Hashtable. However, even tho

docs.oracle.com

 

결론

- 동시성 이슈가 생길 수 있는 멀티스레드 환경에서는 HashMap이 아닌 ConcurrentHashMap을 사용하자.

 

728x90
반응형

'JAVA > Data Structure' 카테고리의 다른 글

[JAVA] 배열(Array)과 ArrayList  (1) 2022.10.13
[JAVA] Queue 자료구조 add와 offer 차이  (0) 2022.10.10
[JAVA] HashMap  (0) 2022.10.08