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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtomicReference与AtomicReferenceFieldUpdater,AtomicReferenceFieldUpdater的目的是什么?相关的知识,希望对你有一定的参考价值。

我想原子地升级我的参考。例如,使用compareAndSetgetAndSet和其他原子操作。

我来自C ++,所以在C ++中我有volatile关键字和不同的原子内在函数,或者<atomic> API。在java中,还有一个volatile关键字和不同的unsafe atomic operations

顺便说一句,还有一个记录良好的AtomicReference(以及LongIntegerBoolean),因此JDK创建者为我们提供了一种安全地执行原子操作以对照引用和原语的方法。 API没有任何问题,它很丰富,看起来非常熟悉。

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

所以我的问题是:

  1. AtomicReferenceFieldUpdater的目的是什么?在我看来,这是隐含的,有点奇怪:你需要声明一个volatile变量提交AND和字段更新器本身。那么我应该在哪里使用FieldUpdater
  2. 它提供了一个间接:你操纵(不改变!)FieldUpdater,而不是变量,这让人感到困惑。
  3. 表现:据我所知,AtomicReferenceFieldUpdaterAtomicReference都委托给不安全人士,因此他们的表现相似,但无论如何:FieldUpdater agaist Reference有没有性能损失?
答案

它用于节省内存。

来自doc的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
 }

它直接宣布leftrightNodeAtomicReferenceFieldUpdaterstatic final

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

private  AtomicReference<Node> left, right;

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

以上是关于AtomicReference与AtomicReferenceFieldUpdater,AtomicReferenceFieldUpdater的目的是什么?的主要内容,如果未能解决你的问题,请参考以下文章

Java并发AtomicReference类

java多线程 CAS原子引用AtomicReference

java多线程--AtomicReference

何时在 Java 中使用 AtomicReference?

Java多线程系列---“JUC原子类”05之 AtomicReference原子类

java多线程系类:JUC原子类:04之AtomicReference原子类