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

问题描述 投票:2回答:1

我想原子地升级我的参考。例如,使用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有没有性能损失?
java multithreading reflection reference atomic
1个回答
3
投票

它用于节省内存。

来自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实例时,它比第一种方法消耗更多的内存。

© www.soinside.com 2019 - 2024. All rights reserved.