2013-07-09 2 views
3

ConcurrentHashMap에는 기본적으로 ReentrantLock을 확장하는 세그먼트가 있습니다.concurrenthashmap의 재진입 잠금은 선택적 "fairness"매개 변수를 사용합니까?

static final class Segment<K,V> extends ReentrantLock implements Serializable 

이 ReentrantLock와는 공정성 속성의 사용합니까?

public ReentrantLock(boolean fair) { 
    sync = fair ? new FairSync() : new NonfairSync(); 
} 

그래서 스레드 T1이 ConcurrentHashMap의의 파티션에 잠금 장치를 읽기 다른 두 개의 스레드 T2와 T3 읽기 기다리고 있습니다와 동일한 파티션에 각각 잠금을 쓰기 말할 수 있습니다. 그래서 어떤 사람 (t2 또는 t3)이 일단 잠금을 해제하면 잠금을 획득하게됩니다.

공정성이 true로 설정되면 내 지식에 따라 가장 길게 기다리는 사람이 될 것입니다. 하지만 동시 HashMap의 경우 true로 설정되어 있습니까? 어떤 스레드가 다음 잠금을 얻는 지 확실하게 말할 수 없다면? ConcurrentHashMap의 소스 코드에서

+1

제가 아는 한 ConcurrentHashMap은 읽기를 잠그지 않습니다. – sanbhat

+0

몇 가지 사소한 경우를 제외하고는 그렇지 않습니다. 제 요점은 이것이 부적절한 데이터로 이끌지 않을 것입니까? putAll() 연산을 수행하고 연산을 읽는다 고 가정 해 봅시다. putAll()에 의한 모든 변경이, 다른 thread에 의한 후속의 읽기에 반영 될까. –

답변

4

우리는 우리가 유일한 생성자를 볼 수 있듯이이 ReentrantLock와

static final class Segment<K,V> extends ReentrantLock 
    ... 
    Segment(float lf, int threshold, HashEntry<K,V>[] tab) { 
      this.loadFactor = lf; 
      this.threshold = threshold; 
      this.table = tab; 
    } 
    ... 

의 서브 클래스를 사용하고 있음을 알 수는 암시 적으로 비 공정 잠금을 생성 ReentrantLock와의 인자없는 생성자를 호출합니다. 그것은 ConcurrentHashMap의 잠금이 항상 불공평하다는 것을 의미합니다.

+0

그럼 어떤 스레드가 다음에 잠금을 획득 할 것인지를 결정할 수있는 순서 또는 확실성이 있습니까? –

+0

아무 것도 없습니다. 그러나 적절한 동시성 수준을 선택하면 문서에 따라 동시 업데이트간에 경합이 없어야합니다. –