引用赋值是原子的,所以为什么使用原子引用

2022-09-01 14:05:12

我有关于原子引用的简单一般问题。

如果引用赋值在java中是原子的,为什么使用AtomicReference?

另外,我想问一下,在64位VM中,引用分析是否是原子的?

我们是否需要易失性来具有参考算术原子?


答案 1

如果引用赋值在java中是原子的,为什么使用AtomicReference?

当创建新值所依据的决策可能取决于引用的先前值时,就需要它。例如,在实现一些LinkedList(如数据结构)时,您不希望将头部设置为引用前一个节点的新节点。在读取前一个节点和将 head 设置为新节点之间的这段时间内,其他一些线程可以同时更新 head 引用的值。如果我们的线程不知道此更改,它将丢失。

我们是否需要易失性来具有参考算术原子?

该操作本身将在执行它的 CPU 内核上以原子方式执行,但不能保证其他内核上的线程在下次读取时会知道它。


答案 2

我之前的答案是不正确的,正如juancn的评论中所解释的那样:

这就是类和易失性访问之间的区别。引用赋值仅在不会发生单词撕裂的意义上是原子的,但没有可见性或重新排序保证。Java保证所有基元类型和引用的这种受限意义上的原子写入,但不适用于长/双(尽管在64位VM中,我认为它们总是原子的)。Atomic*

上一个答案

这是必要的,主要是为了 和 方法。否则,您不能以原子方式执行此操作(需要 2 个操作)。compareAndSetgetAndSet


推荐