我想原子地升级我的参考资料。例如,使用compareAndSet、getAndSet和其他原子操作。
我来自C++,所以在C++中有volatile关键字和不同的原子本质,或者<atomic> API接口。在java中,还有一个volatile关键字和不同的不安全原子操作。
顺便说一下,还有一个文档很好的AtomicReference (以及Long、Integer、Boolean),所以JDK创建者为我们提供了一种方法,可以安全地对引用和原语执行原子操作。API没有什么问题,它很丰富,而且看起来很熟悉。
但是,还有一个AtomicReferenceFieldUpdater whick提供了一种执行原子操作的奇怪方法:您必须通过名称反射“查找”字段,然后才能使用完全相同的操作。
所以我的问题是:
AtomicReferenceFieldUpdater的目的到底是什么?在我看来,这是隐式的,而且有点奇怪:您需要声明一个易失性变量字段和以及字段更新器本身。那么我应该在哪里使用FieldUpdaterFieldUpdater (而不是变量)混淆了这一点。AtomicReferenceFieldUpdater和AtomicReference都将委托给不安全的用户,因此它们的性能是相似的,但是无论如何:对于FieldUpdater agaist引用有任何性能惩罚吗?发布于 2018-10-07 09:27:14
是用来节省记忆的。
来自医生的示例:
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实例时,它比第一种方法消耗更多的内存。
https://stackoverflow.com/questions/52687051
复制相似问题