- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我希望懒惰地创建一些东西并将结果缓存为优化。下面的代码是否安全高效,或者是否有更好的方法来做到这一点?这里需要比较和设置循环吗?
...
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/
我有以下代码。显然,Reference 类不是线程安全的,因为它不保护其“引用”属性。我如何证明我需要通过例如原子引用来保护它? 当我运行以下 JUnit 测试时,它在 Windows:Intel(R
我有一个有关通过原子引用访问各个元素的问题。如果我有一个 IntegerArray 和对其的原子引用;通过 AtomicReference 变量读取和写入数组的各个元素是否会导致数据争用? 在下面的代
谁能给我解释一下: final AtomicReference atomicReference = new AtomicReference<>(1); atomicReference.set(2);
我正在使用一个在发送请求时需要回调的框架。每个回调都必须实现此接口(interface)。回调中的方法是异步调用的。 public interface ClientCallback { publi
我的情况有些特殊。我希望能够使用 AtomicReference 的 compareAndSet() 功能,但有一点改动。 通常,在实际更改之前,您会使用 compareAndSet() 与单个预期值
假设您有以下类(class) public class AccessStatistics { private final int noPages, noErrors; public Acces
所以在我为了好玩而写的各种程序中,都遇到过并发修改异常。 在我天真的尝试解决这个问题时,我使用了 Atomic 而不是某种并发集合。我有点熟悉为什么这是套管错误。本质上,ArrayList 的各个元素
我必须创建一个接受输入参数的单例。基本上我需要根据某些配置在库中创建一个 DBConnector 。现在,此配置由使用应用程序传递到库。根据传入的配置,我想创建一个 DBConnector 实例,然后
有什么方法可以实现一种引用类型,其值可以原子地与另一个交换? 在 Java 中,我们有 AtomicReference,它可以与局部变量交换,但不能与另一个 AtomicReference 交换。 你
Java 是否保证 线程 A 在将数组引用存储在 AtomicReference 之前对数组元素所做的更新将始终对 线程 B 获取此引用? 换句话说,执行此操作的可能输出是什么: class Refe
使用 AtomicReference 的惰性初始化单例的实现是否正确?如果不是 - 可能的问题是什么? import java.io.ObjectStreamException; import jav
我希望懒惰地创建一些东西并将结果缓存为优化。下面的代码是否安全高效,或者是否有更好的方法来做到这一点?这里需要比较和设置循环吗? ... AtomicReference fCachedValue =
假设我有一个 AtomicReference对象列表: AtomicReference> batch = new AtomicReference>(new ArrayList()); 线程 A 将元素
java AtomicReference 是如何工作的?我试着查看代码,但它是基于 sun.misc.Unsafe 的,所以可能另一个问题是 Unsafe 是如何工作的? 最佳答案 这是特定于当前实现
注意:这个问题与内存可见性有关,而不是“公共(public)”、“私有(private)”等。 假设我有以下类(class): public class Data { public final
我必须同步线程之间对共享对象的访问,该共享对象的状态由多个字段组成。说: class Shared{ String a; Integer b; //constructor, getters and s
什么相当于: AtomicReference ref = new AtomicReference( ... ); 但没有同步成本。请注意,我确实想将引用包装在另一个对象中。 我查看了扩展 Refere
我对 AtomicReference 有一个简单的一般性问题。 如果引用分配在 java 中是原子的,为什么要使用 AtomicReference? 另外我想问一下在 64 位 VM 中引用分配是否是
Java AtomicReference#getAndSet 的用例是什么?换句话说,如果我在代码中使用的来自 AtomicReference 的唯一方法是 AtomicReference#getAn
这个问题已经有答案了: Java volatile reference vs. AtomicReference (6 个回答) 已关闭 6 年前。 如果一个类有一个私有(private) Atomic
我是一名优秀的程序员,十分优秀!