Wikipedia的规范化的经过仔细检查的双重检查锁定的稍作修改的版本:
class Foo {
private Helper helper = null;
public Helper getHelper() {
if (helper == null) {
synchronized(this) {
if (helper == null) {
// Create new Helper instance and store reference on
// stack so other threads can't see it.
Helper myHelper = new Helper();
// Atomically publish this instance.
atomicSet(helper, myHelper);
}
}
}
return helper;
}
}
假设基础的原子操作库正常运行,只是简单地使发布的新创建的Helper实例成为原子操作,是否会使这个经过双重检查的锁定习惯更加安全?我意识到在Java中,可以只使用
volatile
,但是即使示例是在伪Java中,这也应该是一个与语言无关的问题。另请参见:
Double checked locking Article
最佳答案
这完全取决于平台/语言的确切内存模型。
我的经验法则:就是不要这样做。无锁(或在这种情况下为减少锁)编程很难,除非您是线程忍者,否则不应尝试编程。您只有在拥有确实需要它的性能分析证明时才考虑使用它,在这种情况下,您将获得有关该特定平台的绝对最佳和最新的有关线程的书籍,并查看它是否可以为您提供帮助。
关于multithreading - 这是双重检查锁定的安全版本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/583123/