无锁和无等待线程安全延迟初始化
2022-09-01 17:39:07
要执行无锁和无等待的惰性初始化,我执行以下操作:
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;
}
}
除了一件事之外,它工作得很好:如果两个线程看到实例,它们都会创建一个新对象,并且只有一个线程幸运地通过CAS操作设置它,这导致资源浪费。null
有没有人建议使用另一种无锁的惰性初始化模式,该模式可以降低通过两个并发线程创建两个昂贵对象的可能性?