2013-12-08 6 views
2

Java ConcurrentHashMap에서 잠금이 작동하는 방식을 이해하고자했습니다. 따라서 소스 코드 here에 따르면, 모든 특정 세그먼트의 잠금을 사용하여 판독기를 잠그는 것처럼 보입니다. 내가 틀렸어? 모든 읽기 아래에 잠겨 있지ConcurrentHashMap 매 읽기마다 잠금?

V readValueUnderLock(HashEntry<K,V> e) { 
    lock(); 
     try { 
      return e.value; 
     } finally { 
      unlock(); 
     } 
    } 

답변

2

는 방법 readValueUnderLock

의 문서 잠금 아래 항목의 값 필드를 읽어들입니다. 값 필드 이 null로 나타나는 경우 호출됩니다.. 컴파일러가 의 테이블 할당을 사용하여 HashEntry 초기화를 재정렬하는 경우에만 컴파일러가 발생합니다 (메모리 모델에서 은 법적으로 실행되지만은 발생하지 않음).

ConcurrentHashMap에서 읽기가 전체 맵에서 동기화되지 않습니다. Infact 탐색은 하나의 조건을 제외하고는 전혀 동기화되지 않습니다. 내부 LinkedList 구현은 기본 컬렉션에 대한 변경 사항을 인식합니다. 탐색 중에 이러한 변경 사항을 감지하면 버켓에서 동기화되고 변경된 값을 다시 읽으려고 시도합니다. 이것은 항상 수신 된 값이 항상 신선하지만, 최소값 잠금이 있으면 항상 보장합니다. 다음은

는 V가 null 인 경우에만 호출이 클래스 readValueUnderLock의 구현을 얻을 수있다

V get(Object key, int hash) { 
    if (count != 0) { // read-volatile 
     HashEntry<K,V> e = getFirst(hash); 
     while (e != null) { 
      if (e.hash == hash && key.equals(e.key)) { 
       V v = e.value; 
     if (v != null) 
      return v; 
     return readValueUnderLock(e); // recheck 
      } 
      e = e.next; 
     } 
    } 
    return null; 
}