흔히 사용되는 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
결론
- 동시성 이슈가 생길 수 있는 멀티스레드 환경에서는 HashMap이 아닌 ConcurrentHashMap을 사용하자.
'JAVA > Data Structure' 카테고리의 다른 글
[JAVA] 배열(Array)과 ArrayList (1) | 2022.10.13 |
---|---|
[JAVA] Queue 자료구조 add와 offer 차이 (0) | 2022.10.10 |
[JAVA] HashMap (0) | 2022.10.08 |