AtomicReference vs AtomicReferenceFieldUpdater,AtomicReferenceFieldUpdater 的目的是什么?

AtomicReference vs AtomicReferenceFieldUpdater, what's a purpose of AtomicReferenceFieldUpdater?

我想自动升级我的参考资料。例如使用compareAndSetgetAndSet等原子操作。

我来自 C++,所以在 C++ 中我有 volatile 关键字和不同的原子内在函数,或者 <atomic> API. In java, there's also a volatile keyword and different unsafe atomic operations.

顺便说一下,还有一个有据可查的 AtomicReference(以及 LongIntegerBoolean),所以 JDK 创造者为我们提供了一种安全地对引用和原语执行原子操作的方法。 [=54=没有错,很丰富,看起来很眼熟。

但是,还有一个 AtomicReferenceFieldUpdater whick 提供了一种执行原子操作的奇怪方式:您必须通过名称反射 "find" 字段,然后您可以使用完全相同的操作。

所以我的问题是:

  1. AtomicReferenceFieldUpdater 的目的到底是什么?在我的 认为它是隐含的并且有点奇怪:你需要声明一个 volatile 变量字段 AND 和字段更新器本身。那么在哪里 我应该使用 FieldUpdater 吗?
  2. 它提供了一种间接的方式:你是 操纵(而不是改变!)FieldUpdater,而不是变量,这令人困惑。
  3. 性能:据我所知,AtomicReferenceFieldUpdaterAtomicReference 委托给不安全的,所以他们的表现 是相似的,但无论如何:是否有任何性能损失 FieldUpdater反对参考?

用于节省内存。

Example 来自文档:

class Node {
   private volatile Node left, right;

   private static final AtomicReferenceFieldUpdater<Node, Node> leftUpdater =
     AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "left");
   private static AtomicReferenceFieldUpdater<Node, Node> rightUpdater =
     AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "right");

   Node getLeft() { return left; }
   boolean compareAndSetLeft(Node expect, Node update) {
     return leftUpdater.compareAndSet(this, expect, update);
   }
   // ... and so on
 }

它直接将leftright声明为NodeAtomicReferenceFieldUpdaterstatic final.

如果没有 AtomicReferenceFieldUpdater,您可能需要将它们声明为 AtomicReference<Node>

private  AtomicReference<Node> left, right;

Node消耗更多的内存。当 Node 的实例很多时,它比第一种方法消耗更多的内存。