AtomicReference与AtomicReferenceFieldUpdater,AtomicReferenceFieldUpdater的目的是什么?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtomicReference与AtomicReferenceFieldUpdater,AtomicReferenceFieldUpdater的目的是什么?相关的知识,希望对你有一定的参考价值。
我想原子地升级我的参考。例如,使用compareAndSet
,getAndSet
和其他原子操作。
我来自C ++,所以在C ++中我有volatile
关键字和不同的原子内在函数,或者<atomic>
API。在java中,还有一个volatile
关键字和不同的unsafe atomic operations。
顺便说一句,还有一个记录良好的AtomicReference(以及Long
,Integer
,Boolean
),因此JDK创建者为我们提供了一种安全地执行原子操作以对照引用和原语的方法。 API没有任何问题,它很丰富,看起来非常熟悉。
但是,还有一个AtomicReferenceFieldUpdater whick提供了一种执行原子操作的奇怪方式:你必须通过名称反射“找到”该字段,然后你可以使用完全相同的操作。
所以我的问题是:
AtomicReferenceFieldUpdater
的目的是什么?在我看来,这是隐含的,有点奇怪:你需要声明一个volatile变量提交AND和字段更新器本身。那么我应该在哪里使用FieldUpdater
?- 它提供了一个间接:你操纵(不改变!)
FieldUpdater
,而不是变量,这让人感到困惑。 - 表现:据我所知,
AtomicReferenceFieldUpdater
和AtomicReference
都委托给不安全人士,因此他们的表现相似,但无论如何:FieldUpdater
agaist Reference有没有性能损失?
它用于节省内存。
来自doc的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
}
它直接宣布left
和right
为Node
。 AtomicReferenceFieldUpdater
是static final
。
如果没有AtomicReferenceFieldUpdater
,您可能需要将它们声明为AtomicReference<Node>
。
private AtomicReference<Node> left, right;
它比Node
消耗更多的内存。当有许多Node
实例时,它比第一种方法消耗更多的内存。
以上是关于AtomicReference与AtomicReferenceFieldUpdater,AtomicReferenceFieldUpdater的目的是什么?的主要内容,如果未能解决你的问题,请参考以下文章
java多线程 CAS原子引用AtomicReference