【发布时间】:2015-07-27 17:28:06
【问题描述】:
要执行无锁和无等待延迟初始化,我执行以下操作:
private AtomicReference<Foo> instance = new AtomicReference<>(null);
public Foo getInstance() {
Foo foo = instance.get();
if (foo == null) {
foo = new Foo(); // create and initialize actual instance
if (instance.compareAndSet(null, foo)) // CAS succeeded
return foo;
else // CAS failed: other thread set an object
return instance.get();
} else {
return foo;
}
}
而且它工作得很好,除了一件事:如果两个线程看到实例null,它们都会创建一个新对象,只有一个幸运的是通过CAS操作设置它,这会导致资源浪费。
是否有人建议另一种 无锁 惰性初始化模式,它可以降低两个并发线程创建两个昂贵对象的可能性?
【问题讨论】:
-
实际上,没有像“无锁线程安全”这样的东西,这在逻辑上是不可能的——因为即使是“从不等待”的复杂工作(重新)调度程序实际上也需要至少一个内部的、瞬态的& 透明甚至不可见的锁,以保持数据一致并防止损坏。但是等待/锁定的数量可以减少到非常很小且有效的最小值,这是正确的。
-
@specializt 通过停放线程锁定与在 CAS 中锁定非常不同......
-
天啊@specializt。术语无锁是众所周知的并且被广泛使用。在这种情况下,没有理由争论这些无关紧要的问题。
-
@SashaSalauyou 你对你的赏金有什么期望?当前的答案缺少什么?
标签: java multithreading lazy-initialization lock-free wait-free