gpt4 book ai didi

java - 如何以安全高效的方式使用 AtomicReference 进行惰性创建和设置?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:03:11 27 4
gpt4 key购买 nike

我希望懒惰地创建一些东西并将结果缓存为优化。下面的代码是否安全高效,或者是否有更好的方法来做到这一点?这里需要比较和设置循环吗?

...
AtomicReference<V> fCachedValue = new AtomicReference<>();

public V getLazy() {
V result = fCachedValue.get();
if (result == null) {
result = costlyIdempotentOperation();
fCachedValue.set(result);
}
return result;
}

编辑:在我的示例中从 coSTLyIdempotentOperation() 设置的值将始终相同,无论哪个线程调用它。

最佳答案

那不是一个很好的系统。问题是两个线程可能会发现 result == null,并且都将 fCachedValue 设置为其新的结果值。

您想使用 compareAndSet(...)方法:

AtomicReference<V> fCachedValue = new AtomicReference<>();

public V getLazy() {
V result = fCachedValue.get();
if (result == null) {
result = costlyIdempotentOperation();
if (!fCachedValue.compareAndSet(null, result)) {
return fCachedValue.get();
}
}
return result;
}

如果多个线程在方法初始化之前进入该方法,它们可能都会尝试创建大型结果实例。他们都将创建自己的版本,但第一个完成该过程的将是将结果存储在 AtomicReference 中的人。其他线程将完成它们的工作,然后处理它们的 result 并改为使用“获胜者”创建的 result 实例。

关于java - 如何以安全高效的方式使用 AtomicReference 进行惰性创建和设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20087173/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com