我想自动升级我的参考。例如,使用compareAndSet
,getAndSet
和其他原子操作。
我来自C++,所以在C++中,我有volatile
关键字和不同的原子内在函数,或<atomic>
API。在Java中,还有一个volatile
关键字和另一个unsafe atomic operations。
顺便说一下,还有一个文档齐全的AtomicReference(以及Long
,Integer
和Boolean
),因此 JDK 的创建者为我们提供了一种安全地对引用和基元执行原子操作的方法。 API没什么错,它很丰富而且看起来很熟悉。
但是,还有一个AtomicReferenceFieldUpdater鞭子提供了一种执行原子操作的怪异方法:您必须通过名称反射来“查找”字段,然后可以使用完全相同的操作。
所以我的问题是:
AtomicReferenceFieldUpdater
的目的是什么?在我的认为它是隐式的,有点奇怪:您需要声明一个
Volatile 变量字段和以及字段更新程序本身。那哪里
我应该使用
FieldUpdater
吗? 操纵(而不是更改!)
FieldUpdater
而不是变量,这很混乱。 AtomicReferenceFieldUpdater
和AtomicReference
委托给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
}
它直接将
left
和right
声明为Node
。 AtomicReferenceFieldUpdater
是static final
。如果没有
AtomicReferenceFieldUpdater
,则可能需要将它们声明为AtomicReference<Node>
。private AtomicReference<Node> left, right;
比
Node
消耗更多的内存。当Node
的实例很多时,它比第一种方法消耗更多的内存。