繁体   English   中英

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

[英]AtomicReference vs AtomicReferenceFieldUpdater, what's a purpose of AtomicReferenceFieldUpdater?

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

我来自C ++,所以在C ++中,我有volatile关键字和不同的原子内在函数,或者是<atomic> API 在Java中,还有一个volatile关键字和不同的不安全原子操作

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

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

所以我的问题是:

  1. AtomicReferenceFieldUpdater的目的是什么? 在我看来,它是隐式的并且有点奇怪:您需要声明一个可变变量字段AND和字段更新程序本身。 那么我应该在哪里使用FieldUpdater
  2. 它提供了一种间接方式:您正在操纵 (而不是更改 !)这会造成混淆的FieldUpdater而不是变量。
  3. 性能:据我所知, AtomicReferenceFieldUpdaterAtomicReference均委托给Unsafe,因此它们的性能相似,但无论如何: FieldUpdater Reference是否有性能损失?

它用于节省内存。

doc中的示例

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM