在“有效Java,第二版”的第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;
}在双重检查成语约书亚中,结果变量用于确保只读取一次易失性字段,从而提高了性能。这一点我理解,但我不明白为什么我们需要它在单一检查成语,因为我们只读了一次字段。
发布于 2012-12-20 21:46:54
在单检查成语中,如果没有结果变量,您仍然要读取它两次;一次用于null检查,一次用于返回值。
发布于 2012-12-20 21:59:59
我更喜欢以下惰性评估的实现:
@ThreadSafe
class MyClass {
private static class MyClassHelper {
public static final MyClass helper = new MyClass();
}
public static MyClass getInstance() {
return MyClassHelper.helper;
}
}https://stackoverflow.com/questions/13980975
复制相似问题