- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我必须同步线程之间对共享对象的访问,该共享对象的状态由多个字段组成。说:
class Shared{
String a; Integer b;
//constructor, getters and setters
....
}
我可能有很多线程读取这个对象,做
//readers
shared.getA();
shared.getB();
并且只有一个线程会在某一点写入:
//writer
shared.setA("state");
shared.setB(1);
现在我的问题是如何确保读取线程不会找到处于不一致状态的共享对象。
我读了很多答案说为了线程之间的一致性 volatile
是解决方案,但我不确定它在多个领域是如何工作的。例如,够了吗?
volatile String a; volatile Integer b;
另一种解决方案是使共享对象不可变并使用 AtomicReference,例如,
AtomicReference<Shared> shared = ....
然后作者将交换引用:
Shared prev = shared.get();
Shared newValue = new Shared("state",1);
while (!shared.compareAndSet(prev, newValue))
这种方法正确吗?谢谢!
更新 在我的设置中,共享对象是从 ConcurrentHashMap<Id,Shared>
中检索的,所以评论一致认为要走的路要么使用不可变方法,要么通过同步所有共享的更新。但是,为了完整起见,很高兴知道上面的解决方案是否带有 ConcurrentHashMap<Id,AtomicReference<Shared>>
是可行的或错误的或只是多余的。谁能解释一下?谢谢!
最佳答案
首先你应该使 Shared
不可变:
class Shared{
private final String a;
private final int b;
//constructor, getters and NO setters
}
如果您只有一个编写器,您可以安全地使用 volatile,在 AtomicReference 中则没有必要。在更新信息时,不应修改旧对象,而应创建新对象并将其分配给 volatile 引用。
关于java - 多个字段 : volatile or AtomicReference?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21283293/
我有以下代码。显然,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
我是一名优秀的程序员,十分优秀!