Concurrent HashMap이 뭘까?
일전에 Java의 동시성 문제의 해결책으로 쓰레드 안정성을 제공하는 java.util.concurrent 패키지를 언급했었는데, 구체적으로 알아보지 못했었다.
java.util.concurrent 패키지에서 제공하는 Concurrent HashMap이 무엇인지 알아보고, 어떻게 동작하는지 학습해보겠다!
ConcurrentHashMap
우선 ConcurrentHashMap이 어떻게 생겼는지 알아보기 위해서 코드를 열어보았는데 정확히 6386줄이다. 두둥...
public class ConcurrentHashMap<K,V> extends AbstractMap<K,V> implements ConcurrentMap<K,V>, Serializable {
. . .
}
위와 같이 생겼는데, 동시성을 보장해주기 때문에 코드 중간에 보면 synchronized 키워드가 사용된다.
이렇게 데이터 값이 변경되는 부분에서만 synchronized를 사용하여 임계영역을 최소화 한다.
게다가 해시맵의 특정 노드에 접근할 때 충돌이 발생하지 않는 경우라면 synchronized를 사용 하지 않도록 내부적으로 구현되어있다.(최적화를 정말 잘한것같다.. 내부 코드도 추가로 분석해서 올려봐야겠다!)
또한 읽기 연산은 대부분 잠금 매커니즘이 적용되지 않아서 빠르게 사용할 수 있다.
그렇기 때문에 병렬처리를 사용할 때 동시에 접근하는 자료형을 사용하고 싶다면 ConcurrentHashMap처럼 스레드 안전한 컬렉션이 유용하다.
HashTable vs ConcurrentHashMap
ConcurrentHashMap과 비교해서 HashTable이 자주 나오는데, HashTable의 구현내용을 보면 아래와 같다.
일단 임계영역을 메서드 전체로 사용했다.(ConcurrentHashMap보다 비효율적)
또한 읽기와 같은 로직(get메서드)에도 synchronized가 적용된 것을 볼 수 있다.
'Java' 카테고리의 다른 글
[Java] 오버라이딩을 구현할 때 @Override이 꼭 필요할까? (1) | 2023.10.23 |
---|---|
[Java] 객체지향과 인터페이스 (0) | 2023.10.20 |
[Java] 객체 지향 프로그래밍의 4가지 특징 (0) | 2023.10.19 |
String과 StringBuffer/StringBuilder (0) | 2023.09.12 |