首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AtomicReference vs AtomicReferenceFieldUpdater,AtomicReferenceFieldUpdater的目的是什么?

AtomicReference vs AtomicReferenceFieldUpdater,AtomicReferenceFieldUpdater的目的是什么?
EN

Stack Overflow用户
提问于 2018-10-07 09:12:08
回答 1查看 1.4K关注 0票数 8

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

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

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

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

所以我的问题是:

  1. AtomicReferenceFieldUpdater的目的到底是什么?在我看来,这是隐式的,而且有点奇怪:您需要声明一个易失性变量字段以及字段更新器本身。那么我应该在哪里使用FieldUpdater
  2. 它提供了一个间接性:您正在操作(不是更改!)FieldUpdater (而不是变量)混淆了这一点。
  3. 性能:据我所知,AtomicReferenceFieldUpdaterAtomicReference都将委托给不安全的用户,因此它们的性能是相似的,但是无论如何:对于FieldUpdater agaist引用有任何性能惩罚吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-07 09:27:14

是用来节省记忆的。

来自医生的示例

代码语言:javascript
复制
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>

代码语言:javascript
复制
private  AtomicReference<Node> left, right;

Node. 占用更多内存的当有许多Node实例时,它比第一种方法消耗更多的内存。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52687051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档