2015-01-20 5 views
0

나는 다시 확인 관용구 및 인스턴스 필드의 초기화 지연에 대한 단일 체크 관용구에 대한 '효과적인 자바'의 항목 (71)의 코드 조각 이해할 수 없다 :단일 및 이중 체크 초기화 지연

한 번 확인 관용구

private volatile FieldType field; 
FieldType getField() { 
    FieldType result = field; 
    if (result == null) { 
    synchronized(this) { 
     result == field; 
     if (result == null) 
     field = result = computeFieldValue(); 
    } 
    } 
    return result; 
} 

단일 체크 관용구

private volatile FieldType field; 
FieldType getField() { 
    FieldType result = field; 
    if (result == null) { 
    field = result = computeFieldValue(); 
    } 
    return result; 
} 

우리는 이해할 수 있듯이 compute FieldValue()을 원자 적으로 수행하기 위해 첫 번째 경우에 잠금을 사용합니다. 그러나 두 번째 경우에이를 생략하는 이유는 무엇입니까? 이제는 어떤 외계 스레드가 계산에 참여하는 일부 값을 손상시킬 수 있기 때문입니다. 나는 무엇을 놓쳤는가?

+0

위의 예의 Line 6은 result = field 여야합니다. 아니 ==, 안 그래? – tamberg

답변

4

이중 확인 잠금 지점은 computeFieldValue이 한 번만 호출되고 필드는 한 번만 기록되도록합니다.

두 번 이상이 메서드를 호출하여 과도한 잠금을 설정하는 경우가 있습니다. 이러한 조건의 일부 만나고 있습니다

  • computeFieldValue 항상 같은 값을 반환하는 순수 기능이어야한다;
  • 두 번 이상 호출되는 위험의 크기는 수용 할 수 있습니다 (성능에 여러 번 영향을 미칠 가능성).
+0

이제 취소하겠습니다. 고맙습니다. – Dmytro