2014-12-22 4 views
2

저는 Java와 stackoverflow를 처음 사용하며 Collections Framework에서 일한 숙련 된 사람들의 답을 구하고 있습니다.ConcurrentHashMap과 해시 테이블의 차이점

hashTable은 스레드로부터 안전하며 concurrentHashMap이기도하지만 concurrentHashMap은 액세스하는 스레드에 대한 맵 세그먼트를 잠그기 때문에 hashHable보다 빠릅니다.

내부적으로 어떻게 작동합니까? 세그먼트의 크기는 어떻게 결정됩니까? 예 : concurrentHashMap에 40 개의 항목이 있고 데이터 검색/수정을 시도하는 3 개의 스레드가있는 경우 세그먼트는 어떻게 결정됩니까?

모든 이미지/설명/코드가 정말 멋지 네요. 미리 감사드립니다.

+0

기본적으로 ConcurrentHashMap은 많은 컨텍스트 스위치 및 대기를 유발하는 잠금 대신 CAS 작업을 사용하여 구현되므로 성능이 향상되었습니다. – Maxim

+0

이것은 ConcurrentHashMap의 훌륭한 기사입니다 : http://www.burnison.ca/articles/the-concurrency-of-concurrenthashmap –

+0

고마워요,이게 정말 도움이됩니다. 다른 질문이 "HashMap과 HashTable의 차이점"이기 때문에 복제본으로 표시된 이유는 확실하지 않습니다. – Kay

답변

-1

concurrentHashMap - 잠금 알고리즘을 자유롭게합니다. 읽기 또는 쓰기 작업 간에는 동기화가 없습니다. 자바 문서

업데이트를 취득에서는 전체 동시성 및 조정 예상 동시성을 지원하는 해시 테이블 당으로 . 이 클래스는 Hashtable과 동일한 기능을 수행하는 을 따르며 Hashtable의 각 메소드에 해당하는 메소드 의 버전을 포함합니다. 그러나 모든 작업은 스레드로부터 안전하지만 검색 작업에는 잠금이 필요하지 않으며 모든 테이블을 에 잠그면 모든 액세스가 차단됩니다. 이 클래스는 스레드 안전성에 의존하지만 동기화 정보 인 에는 의존하지 않는 프로그램에서 Hashtable과 완벽하게 상호 운용됩니다.

HashTable - 모든 것이 동기화됩니다. 읽기 및 쓰기 작업간에 완전히 동기화 됨

+0

감사합니다. Siva. "검색 작업이 잠금을 수반하지 않는다"는 것은 쓰기 작업이 세그먼트를 잠그는 것을 의미합니까? "모든 액세스를 차단하는 방식으로 전체 테이블을 잠그는 지원은 없습니다."이 줄에서는 일부 테이블이 잠긴 상태이지만 전체 테이블은 잠그지 않았 음을 나타냅니다. 어느 시점에서든 테이블/세그먼트의 스레드가 잠금을 얻었는지 설명 할 수 있습니까? – Kay

+1

'ConcurrentHashMap'은 * lock *이 없습니다. –

+0

Steven이 맞습니다. CHM은 확실히 *** ***이 아닙니다. ConcurrentLinkedQueue는 잠금이 없지만 CHM은 분할 잠금을 사용합니다. –

관련 문제