我读过所有关于双重检查锁定修复程序如何工作的内容,我不喜欢延迟初始化,但能够修复遗留代码并且这样的问题太诱人而不尝试解决。我的例子: private int timesSafelyGotten = 0; private Helper helper = null;Java通过强制同步两次检查加锁,可行吗?
public getHelper()
{
if (timesSafelyGotten < 1) {
synchronized (this) {
if (helper == null) {
helper = new Helper();
} else {
timesSafelyGotten++;
}
}
}
return helper;
}
这样,同步代码必须运行一次创建帮助,一旦当它得到首次所以理论上timesSafelyGotten不能递增,直到它创造的助手同步码后已经释放锁定和助手必须完成初始化。
我没有看到任何问题,但它是如此简单,似乎太好,不真实,你怎么看?
迦勒詹姆斯·迪莱尔
如果您阅读(并了解)为什么双重检查锁定被破坏的详细解释之一,您将明白为什么您的代码也被破坏。 – 2009-12-10 05:33:34
它也值得注意的是,随着Java 5和易失性,你可以做不间断的双重检查锁定。 Java 4和更早的你的声明确实如此。 – 2009-12-10 05:40:36
还值得注意的是,使用J5并大大提高了无争用锁的性能,DCL几乎总是过早的优化,不值得冒这个风险。 – 2009-12-10 06:16:53