Ale*_*you 27 java multithreading lock-free lazy-initialization wait-free
要执行无锁和无等待的延迟初始化,请执行以下操作:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
除了一件事之外,它的效果非常好:如果两个线程看到实例null,它们都会创建一个新对象,只有一个幸运的是通过CAS操作设置它,这会浪费资源.
有没有人建议另一种无锁延迟初始化模式,这会降低两个并发线程创建两个昂贵对象的可能性?
Joh*_*int 22
如果你想要真正的锁定自由,你将不得不做一些旋转.您可以拥有一个线程'获胜'创建权,但其他人必须旋转直到它准备就绪.
private AtomicBoolean canWrite = new AtomicBoolean(false);
private volatile Foo foo;
public Foo getInstance() {
while (foo == null) {
if(canWrite.compareAndSet(false, true)){
foo = new Foo();
}
}
return foo;
}
Run Code Online (Sandbox Code Playgroud)
这显然存在繁忙旋转的问题(你可以在那里放一个睡眠或产量),但我可能仍然会建议按需初始化.
| 归档时间: |
|
| 查看次数: |
2871 次 |
| 最近记录: |