在 Wikipedia 中阅读DCL 时,我想知道 DCL 中的问题和建议的解决方案,或者换句话说,为什么volatile
需要关键字?简而言之,问题是:在某些情况下,使用 DCL 可能会导致线程使用部分构造的对象。建议的解决方案(对于 JAVA 5+):
// Works with acquire/release semantics for volatile
// Broken under Java 1.4 and earlier semantics for volatile
class Foo {
private volatile Helper helper;
public Helper getHelper() {
Helper result = helper;
if (result == null) {
synchronized(this) {
result = helper;
if (result == null) {
helper = result = new Helper();
}
}
}
return result;
}
// other functions and members...
}
现在,我的问题是为什么不放弃volatile
from 助手?如果我错了,请纠正我,但如果你只是打破这一行:helper = result = new Helper();
到:
result = new Helper();
helper = result;
在这种情况下,helper
在对象完成之前永远不会获得引用。不是这样吗?表现如何volatile
更好?
编辑:假设这段代码:
class Foo {
private volatile Helper helper;
public Helper getHelper() {
Helper result = helper;
if (result == null) {
synchronized(this) {
result = helper;
if (result == null) {
result = new Helper();
result.someMethod();
helper = result;
}
}
}
return result;
}
}
如果初始化后的下一行不能保证一个完全初始化的对象,我不能调用它的方法。我可以吗?