我想自动升级我的参考资料。例如,使用compareAndSet
,getAndSet
和其他原子操作。
我来自C ++,所以在C ++中,我有volatile
关键字和不同的原子内在函数,或<atomic>
API。在Java中,还有一个volatile
关键字和另一个unsafe atomic operations。
顺便说一句,还有一个文档齐全的AtomicReference(以及Long
,Integer
,Boolean
),所以 JDK 创造者为我们提供了一种针对引用和基元安全执行原子操作的方法。该API没什么错,它很丰富而且看起来很熟悉。
但是,还有一种AtomicReferenceFieldUpdater鞭子提供了一种执行原子操作的怪异方式:您必须通过名称反射来“查找”字段,然后才能使用完全相同的操作。
所以我的问题是:
AtomicReferenceFieldUpdater
的目的是什么?在我的
认为它是隐式的并且有点奇怪:您需要声明一个
易失性变量提交了 AND 和字段更新程序本身。那哪里
我应该使用FieldUpdater
吗?FieldUpdater
(而不是变量)会引起混淆。AtomicReferenceFieldUpdater
和
AtomicReference
被委派给不安全的人,因此他们的表现
相似,但无论如何:是否存在以下性能损失?
FieldUpdater
反对参考?答案 0 :(得分:3)
它用于节省内存。
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
的实例很多时,它比第一种方法消耗更多的内存。