ConsurenthashMap (CHM For Short)은 Hashtable의 대안으로 Java 1.5에서 새로 소개되었으며 Concurrent 패키지의 중요한 멤버입니다. Java 1.5 이전에는 멀티 스레드 및 동시 프로그램에서 안전하게 사용할 수있는 맵을 구현하려면 Hashmap이 스레드 안전하지 않기 때문에 Hashtable 및 Synchronized Map에서만 선택할 수 있습니다. 그러나 CHM을 소개 한 후에는 더 나은 선택이 있습니다. CHM은 스레드 안전뿐만 아니라 해시 가능 및 동기화 된 맵보다 더 잘 수행됩니다. Hashtable 및 SynchronizedMap과 비교하여 전체 맵이 잠겨 있으며 CHM은 일부 맵 만 잠그는 것입니다. CHM은 동시 잠금을 통해 쓰기 작업 중에 데이터 무결성을 유지하면서 동시 읽기 작업을 허용합니다. 우리는 JDK 5와 6의 상위 5 개의 Java 동시 컬렉션에서 CHM의 기본 사항을 배웠습니다.이 블로그에서는 다음과 같은 점을 소개합니다.
Java에서 ConcurrenthashMap의 구현
CHM은 세분화를 소개하고 hashtable에서 지원하는 모든 기능을 제공합니다. CHM에서 멀티 스레딩은 맵을 읽도록 지원되며 차단이 필요하지 않습니다. 이는 CHM이 맵을 다른 부품으로 나누고 업데이트 작업을 수행 할 때 맵을 잠그는 사실 때문입니다. 기본 동시성 레벨에 따르면, 맵은 16 개의 부분으로 나뉘며 다른 잠금으로 제어됩니다. 이는 최대 16 개의 쓰기 스레드가 동시에 맵을 작동 할 수 있음을 의미합니다. 단 하나의 스레드에서만 16 개의 쓰기 스레드가 동시에 들어가는 스레드 (읽기 스레드가 거의 무제한)에서만 성능 향상이 분명하다고 상상해보십시오. 그러나 put (), remove (), putall () 및 clear ()와 같은 일부 업데이트 작업은 작동 만 잠그므로 검색 작업은 최신 결과가 반환 될 것을 보장 할 수 없습니다.
또 다른 중요한 요점은 CHM을 반복 할 때 키 세트로 반복 된 반복기가 약하게 일관되고 안전하지 않으며 최근 변경 사항을 반환하지 않을 수 있다는 것입니다. 트래버스 동안, 트래버스 된 배열의 내용이 변경되면, 동시 모형화 외관 예외는 발생하지 않습니다.
CHM의 기본 동시성 레벨은 16이지만 CHM을 만들 때 생성자가 변경할 수 있습니다. 동시성 레벨이 동시 업데이트 작업의 수를 나타내는 것은 의심의 여지가 없으므로 몇 개의 스레드 만 맵을 업데이트하면 동시성 수준이 낮은 것을 설정하는 것이 좋습니다. 또한 CHM은 ReentrantLock을 사용하여 세그먼트를 잠급니다.
Java의 ConcurrenthashMap putifabsent 방법의 예
여러 번 우리는 존재하지 않을 때 요소를 삽입하려고하며 일반적으로 다음과 같은 코드를 작성합니다.
synchronized (map) {if (map.get (key) == null) {return map.put (key, value); } else {return map.get (키); }}위의 코드는 Hashmap 및 Hashtable에서 사용하기 쉽지만 CHM에는 오류가 발생할 위험이 있습니다. CHM이 PUT 작업 중에 전체 맵을 잠그지 않기 때문에 하나의 스레드를 넣을 때 (k, v) 다른 스레드 호출이 (k) 얻어지고 NULL을 얻으므로 다른 스레드 값의 값에 의해 한 스레드의 값이 덮어 쓰게됩니다. 물론 코드를 동기화 된 코드 블록으로 캡슐화 할 수있어 스레드-안전하지만 코드를 단일 스레드로 만들 수 있습니다. CHM이 제공하는 putifabsent (키, 값) 방법은 위의 스레드 경쟁의 위험을 피하면서 동일한 기능을 원자 적으로 구현합니다.
ConcurrEthashMap을 사용하는시기
CHM은 독자 수가 독자 수를 초과 할 때, 독자 수가 독자보다 크거나 동일 할 때 CHM의 성능은 해시 가능 및 동기화 된 맵보다 낮습니다. 전체 맵이 잠겨있을 때 읽기 작업이 쓰기 작업을 동일한 부분으로 수행하여 종료하는 스레드를 기다립니다. CHM은 캐시를 만드는 데 적합하고 프로그램 시작시 초기화 한 다음 여러 요청 스레드에서 액세스 할 수 있습니다. Javadoc이 설명했듯이 CHM은 Hashtable에 대한 좋은 대안이지만 CHM은 Hashtable보다 동기화가 약간 덜 적합하다는 것을 기억하십시오.
요약
이제 우리는 ConcurrenTashMap이 무엇인지, 동의어를 사용하는시기를 알고 있습니다. CHM의 몇 가지 핵심 사항을 검토해 봅시다.
위는 Java에서 CHM의 구현 및 사용 시나리오입니다. 모든 사람을 도울 수 있기를 바랍니다! 이 사이트를 지원 해주셔서 감사합니다!