在“Effective Java, 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 中,结果变量用于确保 volatile字段只被读取一次,从而提高了性能。这我理解,但是我不明白为什么我们需要在单检查习语中使用它,因为无论如何我们只读取一次字段。