以下は、Effective Java 2nd Edition のスニペットです。ここで著者は、次のコードは、結果変数を使用しない場合よりも 25% 高速であると主張しています。本によると、「この変数が行うことは、フィールドがすでに初期化されている一般的なケースで、フィールドが一度だけ読み取られるようにすることです。」. ローカル変数の結果を使用しない場合、値が初期化された後に比較してこのコードが高速になる理由を理解できません。どちらの場合でも、ローカル変数の結果を使用するかどうかに関係なく、初期化後に volatile 読み取りが 1 回だけ行われます。
// Double-check idiom for lazy initialization of instance fields
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;
}