猿问

AtomicReference vs AtomicReferenceFieldUpdater

我想以原子方式升级我的参考。例如使用compareAndSet,getAndSet和其他原子操作。

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

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

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

所以我的问题是:

  1. 这样做的目的是AtomicReferenceFieldUpdater什么?在我看来,这是隐含的并且有点奇怪:您需要声明一个 volatile 变量字段AND和字段更新程序本身。那么我应该在哪里使用FieldUpdater?

  2. 它提供了一种间接方式:您正在 操纵(而不是更改!)FieldUpdater,而不是变量,这令人困惑。

  3. 性能:据我所知,无论是AtomicReferenceFieldUpdater和 AtomicReference被委托给不安全,所以其性能基本相近,但无论如何:是否有任何性能损失 FieldUpdater安剑铮,卓杰参考?


慕的地6264312
浏览 176回答 1
1回答

qq_笑_17

它用于节省内存。文档中的示例:class Node {&nbsp; &nbsp;private volatile Node left, right;&nbsp; &nbsp;private static final AtomicReferenceFieldUpdater<Node, Node> leftUpdater =&nbsp; &nbsp; &nbsp;AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "left");&nbsp; &nbsp;private static AtomicReferenceFieldUpdater<Node, Node> rightUpdater =&nbsp; &nbsp; &nbsp;AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "right");&nbsp; &nbsp;Node getLeft() { return left; }&nbsp; &nbsp;boolean compareAndSetLeft(Node expect, Node update) {&nbsp; &nbsp; &nbsp;return leftUpdater.compareAndSet(this, expect, update);&nbsp; &nbsp;}&nbsp; &nbsp;// ... and so on&nbsp;}它直接声明left和right作为Node。并且AtomicReferenceFieldUpdater是static final。如果没有AtomicReferenceFieldUpdater,您可能需要将它们声明为AtomicReference<Node>.private&nbsp; AtomicReference<Node> left, right;消耗的内存比Node. 当 有很多实例时Node,它比第一种方法消耗更多的内存。
随时随地看视频慕课网APP

相关分类

Java
我要回答