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

时间:2018-10-07 09:12:08

标签: java multithreading reflection reference atomic

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

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

顺便说一句,还有一个文档齐全的AtomicReference(以及LongIntegerBoolean),所以 JDK 创造者为我们提供了一种针对引用和基元安全执行原子操作的方法。该API没什么错,它很丰富而且看起来很熟悉。

但是,还有一种AtomicReferenceFieldUpdater鞭子提供了一种执行原子操作的怪异方式:您必须通过名称反射来“查找”字段,然后才能使用完全相同的操作。

所以我的问题是:

  1. AtomicReferenceFieldUpdater的目的是什么?在我的 认为它是隐式的并且有点奇怪:您需要声明一个 易失性变量提交了 AND 和字段更新程序本身。那哪里 我应该使用FieldUpdater吗?
  2. 它提供了一种间接方式: 操作(而不是更改!),FieldUpdater(而不是变量)会引起混淆。
  3. 性能:据我所知,AtomicReferenceFieldUpdaterAtomicReference被委派给不安全的人,因此他们的表现 相似,但无论如何:是否存在以下性能损失? FieldUpdater反对参考?

1 个答案:

答案 0 :(得分:3)

它用于节省内存。

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声明为Node。而AtomicReferenceFieldUpdaterstatic final

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

private  AtomicReference<Node> left, right;

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