AtomicReferenceFieldUpdater

AtomicReferenceFieldUpdater

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

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

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

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

所以我的问题是:

  • AtomicReferenceFieldUpdater的目的是什么?在我的
    认为它是隐式的,有点奇怪:您需要声明一个
    Volatile 变量字段以及字段更新程序本身。那哪里
    我应该使用FieldUpdater吗?
  • 它提供了一种间接方式:
    操纵(而不是更改!)FieldUpdater而不是变量,这很混乱。
  • 性能:据我所知,AtomicReferenceFieldUpdaterAtomicReference委托给Unsafe,因此它们的性能
    是相似的,但无论如何:是否存在以下性能损失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的实例很多时,它比第一种方法消耗更多的内存。

    07-24 09:18