在“Effective Java,第二版”的第 71 项中,为延迟实例化实例字段引入了 Double-check idiom 和 single-check idiom。
仔细检查成语
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 指出,result 变量用于确保 volatile field 仅被读取一次,从而提高性能。我理解这一点,但是我不明白为什么我们需要在单次检查习语中使用它,因为无论如何我们只读取一次 field。
最佳答案
在单一检查习惯用法中,如果没有结果变量,您仍然会阅读它两次;一次用于空检查,一次用于返回值。
关于java - 使用单一检查习语的惰性初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13980975/