からダブル チェック ロックについて読んでいEffective Java
ます。コードは次のことを行います。
private volatile FieldType field;
FieldType getField() {
FieldType result = field;
if (result == null) { // First check (no locking)
synchronized(this) {
result = field;
if (result == null) // Second check (with locking)
field = result = computeFieldValue();
}
}
return result;
}
を使用する必要はないresult
ように見えますが、実際には、field
既に初期化されている一般的なケースで一度だけ読み取られることが保証されます。
しかし、私はこれを理解していません。if(field == null)
直接行うこととの違いは何ですか?if (result == null)
述べたように優れていることは言うまでもなく、 なぜ異なるのかわかりません。