나는 다시 확인 관용구 및 인스턴스 필드의 초기화 지연에 대한 단일 체크 관용구에 대한 '효과적인 자바'의 항목 (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()
을 원자 적으로 수행하기 위해 첫 번째 경우에 잠금을 사용합니다. 그러나 두 번째 경우에이를 생략하는 이유는 무엇입니까? 이제는 어떤 외계 스레드가 계산에 참여하는 일부 값을 손상시킬 수 있기 때문입니다. 나는 무엇을 놓쳤는가?
위의 예의 Line 6은 result = field 여야합니다. 아니 ==, 안 그래? – tamberg