는 방법 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;
}