AtomicReference vs AtomicReferenceFieldUpdater,AtomicReferenceFieldUpdater 的目的是什么?
AtomicReference vs AtomicReferenceFieldUpdater, what's a purpose of AtomicReferenceFieldUpdater?
我想自动升级我的参考资料。例如使用compareAndSet
、getAndSet
等原子操作。
我来自 C++,所以在 C++ 中我有 volatile
关键字和不同的原子内在函数,或者 <atomic>
API. In java, there's also a volatile
keyword and different unsafe atomic operations.
顺便说一下,还有一个有据可查的 AtomicReference(以及 Long
、Integer
、Boolean
),所以 JDK 创造者为我们提供了一种安全地对引用和原语执行原子操作的方法。 [=54=没有错,很丰富,看起来很眼熟。
但是,还有一个 AtomicReferenceFieldUpdater whick 提供了一种执行原子操作的奇怪方式:您必须通过名称反射 "find" 字段,然后您可以使用完全相同的操作。
所以我的问题是:
AtomicReferenceFieldUpdater
的目的到底是什么?在我的
认为它是隐含的并且有点奇怪:你需要声明一个
volatile 变量字段 AND 和字段更新器本身。那么在哪里
我应该使用 FieldUpdater
吗?
- 它提供了一种间接的方式:你是
操纵(而不是改变!)
FieldUpdater
,而不是变量,这令人困惑。
- 性能:据我所知,
AtomicReferenceFieldUpdater
和
AtomicReference
委托给不安全的,所以他们的表现
是相似的,但无论如何:是否有任何性能损失
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
的实例很多时,它比第一种方法消耗更多的内存。
我想自动升级我的参考资料。例如使用compareAndSet
、getAndSet
等原子操作。
我来自 C++,所以在 C++ 中我有 volatile
关键字和不同的原子内在函数,或者 <atomic>
API. In java, there's also a volatile
keyword and different unsafe atomic operations.
顺便说一下,还有一个有据可查的 AtomicReference(以及 Long
、Integer
、Boolean
),所以 JDK 创造者为我们提供了一种安全地对引用和原语执行原子操作的方法。 [=54=没有错,很丰富,看起来很眼熟。
但是,还有一个 AtomicReferenceFieldUpdater whick 提供了一种执行原子操作的奇怪方式:您必须通过名称反射 "find" 字段,然后您可以使用完全相同的操作。
所以我的问题是:
AtomicReferenceFieldUpdater
的目的到底是什么?在我的 认为它是隐含的并且有点奇怪:你需要声明一个 volatile 变量字段 AND 和字段更新器本身。那么在哪里 我应该使用FieldUpdater
吗?- 它提供了一种间接的方式:你是
操纵(而不是改变!)
FieldUpdater
,而不是变量,这令人困惑。 - 性能:据我所知,
AtomicReferenceFieldUpdater
和AtomicReference
委托给不安全的,所以他们的表现 是相似的,但无论如何:是否有任何性能损失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
的实例很多时,它比第一种方法消耗更多的内存。