2012-06-13 5 views
3

버킷 레벨 잠금 때문에 Collections.synchronizedMap (...)/hashtable 대신 CHM이 성능 향상을 제공합니다.ConcurrentHashMap에서 'thread-safe'의 의미

또한 이터레이터가 ConcurrentModificationException을 발생시키지 않도록하려면 CHM을 사용하는 것이 좋습니다.

그러나 검색 및 중복 작성간에 변경 사항이 반영되지 않으므로 CHM과 관련하여 thread-safe의 의미와 혼동됩니까?

+0

"그들은 취득에서는 사이 반영하려면 변경을 방지하지 않고 겹쳐 씁니다." 나는 그것에서 많은 이해가되지 않는다. 제발 다시 말해봐. – EJP

답변

1

는 엑스와 같은 외부 잠금없이 여러 스레드에 걸쳐 ConcurrentHashMap 객체를 공유하는 것이 ConcurrentHashMap의 (Sun의 현재 구현은) 별도의 버킷의 번호로 기본지도를 나누어 작동처럼 작동 방법 Thread-Safe

이라고 언급했다. 요소를 얻는 것은 그 자체로 잠금을 필요로하지 않지만 원자 배리어 (잠재적으로 매우 비용이 많이 들며 다른 가능한 최적화를 방해 함)를 의미하는 원자/휘발성 작업을 사용하지만 Collections.synchronizedMap(...) 잠금이 전체 맵에 적용되므로 값 비쌉니다 .

사용법 : ConcurrentHashMap is implemented for higher throughput in cases where high concurrency is expected

2

스레드 안전성이란 여러 스레드에서 ConcurrentHashMap 개체를 공유하고 외부 잠금없이 해당 개체에 동시에 액세스하거나 수정할 수 있다는 것입니다.

정확한 의미는 documentation에 설명되어있다 : 일반적으로 차단하지 않기 때문에 (putremove 포함)에 업데이트 연산과 중첩 될 수있다 (get 포함)

취득 조작. 검색은 가장 최근에 완료된 업데이트 작업의 결과를 반영합니다.

putAllclear과 같은 집계 연산의 경우 동시 검색은 일부 항목 만 삽입하거나 제거하는 것을 반영 할 수 있습니다. 마찬가지로 IteratorsEnumerations은 반복자/열거 형을 만들 때 또는 생성 한 시점에서 해시 테이블의 상태를 반영하는 요소를 반환합니다. 그들은 ConcurrentModificationException을 던지지 않습니다. 그러나 이터레이터는 한 번에 하나의 스레드에서만 사용하도록 설계되었습니다.