gpt4 book ai didi

java - AtomicReference vs AtomicReferenceFieldUpdater,AtomicReferenceFieldUpdater 的目的是什么?

转载 作者:行者123 更新时间:2023-11-30 07:44:18 25 4
gpt4 key购买 nike

我想自动升级我的引用。例如使用 compareAndSet , getAndSet和其他原子操作。

我来自 C++,所以在 C++ 中我有 volatile关键字和不同的原子内在函数,或 <atomic> API .在java中,还有一个volatile关键字和不同unsafe atomic operations .

顺便说一下,还有一个有据可查的 AtomicReference (以及 LongIntegerBoolean ),因此 JDK 的创建者为我们提供了一种针对引用和原语安全执行原子操作的方法。 API没什么问题,很丰富,看起来很眼熟。

但是,还有一个 AtomicReferenceFieldUpdater whick 提供了一种执行原子操作的奇怪方式:您必须通过名称反射“找到”该字段,然后您可以使用完全相同的操作。

所以我的问题是:

  1. AtomicReferenceFieldUpdater 的目的是什么?在所有?在我的认为它是隐含的并且有点奇怪:你需要声明一个volatile 变量字段 AND 和字段更新器本身。那么在哪里我应该使用 FieldUpdater 吗? ?
  2. 它提供了一种间接的方式:你是操纵(不是改变!)FieldUpdater ,而不是变量,这令人困惑。
  3. 性能:据我所知,AtomicReferenceFieldUpdaterAtomicReference委托(delegate)给不安全的,所以他们的表现是相似的,但无论如何:是否有任何性能损失 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
}

它声明leftright作为Node直接地。和 AtomicReferenceFieldUpdaterstatic final .

没有AtomicReferenceFieldUpdater ,您可能需要将它们声明为 AtomicReference<Node> .

private  AtomicReference<Node> left, right;

Node 消耗更多内存 。当 Node 有很多实例时,它比第一种方法消耗更多的内存。

关于java - AtomicReference vs AtomicReferenceFieldUpdater,AtomicReferenceFieldUpdater 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52687051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com