「EffectiveJava、Second Edition」の項目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;
}
ダブルチェックのイディオムであるJoshuaは、結果変数を使用して、揮発性フィールドが1回だけ読み取られるようにし、パフォーマンスを向上させると述べています。これは理解できますが、とにかくフィールドを1回しか読み取らないため、シングルチェックイディオムでなぜそれが必要なのかわかりません。