【发布时间】:2015-01-20 15:07:59
【问题描述】:
我无法理解“Effective 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;
}
据我所知,我们在第一种情况下使用锁定,以便compute FieldValue() 原子地执行。但是为什么我们在第二种情况下省略它呢?因为现在一些外来线程可能会破坏一些参与计算的值。我错过了什么?
【问题讨论】:
-
上例中的第 6 行应该是 result = field;不是 ==,不是吗?
标签: java multithreading thread-safety lazy-initialization