- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想自动升级我的引用。例如使用 compareAndSet
, getAndSet
和其他原子操作。
我来自 C++,所以在 C++ 中我有 volatile
关键字和不同的原子内在函数,或 <atomic>
API .在java中,还有一个volatile
关键字和不同unsafe atomic operations .
顺便说一下,还有一个有据可查的 AtomicReference (以及 Long
、 Integer
、 Boolean
),因此 JDK 的创建者为我们提供了一种针对引用和原语安全执行原子操作的方法。 API没什么问题,很丰富,看起来很眼熟。
但是,还有一个 AtomicReferenceFieldUpdater whick 提供了一种执行原子操作的奇怪方式:您必须通过名称反射“找到”该字段,然后您可以使用完全相同的操作。
所以我的问题是:
AtomicReferenceFieldUpdater
的目的是什么?在所有?在我的认为它是隐含的并且有点奇怪:你需要声明一个volatile 变量字段 AND 和字段更新器本身。那么在哪里我应该使用 FieldUpdater
吗? ?FieldUpdater
,而不是变量,这令人困惑。AtomicReferenceFieldUpdater
和 AtomicReference
委托(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
}
它声明left
和 right
作为Node
直接地。和 AtomicReferenceFieldUpdater
是static final
.
没有AtomicReferenceFieldUpdater
,您可能需要将它们声明为 AtomicReference<Node>
.
private AtomicReference<Node> left, right;
比 Node
消耗更多内存
。当 Node
有很多实例时,它比第一种方法消耗更多的内存。
关于java - AtomicReference vs AtomicReferenceFieldUpdater,AtomicReferenceFieldUpdater 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52687051/
我有以下代码。显然,Reference 类不是线程安全的,因为它不保护其“引用”属性。我如何证明我需要通过例如原子引用来保护它? 当我运行以下 JUnit 测试时,它在 Windows:Intel(R
我有一个有关通过原子引用访问各个元素的问题。如果我有一个 IntegerArray 和对其的原子引用;通过 AtomicReference 变量读取和写入数组的各个元素是否会导致数据争用? 在下面的代
谁能给我解释一下: final AtomicReference atomicReference = new AtomicReference<>(1); atomicReference.set(2);
我正在使用一个在发送请求时需要回调的框架。每个回调都必须实现此接口(interface)。回调中的方法是异步调用的。 public interface ClientCallback { publi
我的情况有些特殊。我希望能够使用 AtomicReference 的 compareAndSet() 功能,但有一点改动。 通常,在实际更改之前,您会使用 compareAndSet() 与单个预期值
假设您有以下类(class) public class AccessStatistics { private final int noPages, noErrors; public Acces
所以在我为了好玩而写的各种程序中,都遇到过并发修改异常。 在我天真的尝试解决这个问题时,我使用了 Atomic 而不是某种并发集合。我有点熟悉为什么这是套管错误。本质上,ArrayList 的各个元素
我必须创建一个接受输入参数的单例。基本上我需要根据某些配置在库中创建一个 DBConnector 。现在,此配置由使用应用程序传递到库。根据传入的配置,我想创建一个 DBConnector 实例,然后
有什么方法可以实现一种引用类型,其值可以原子地与另一个交换? 在 Java 中,我们有 AtomicReference,它可以与局部变量交换,但不能与另一个 AtomicReference 交换。 你
Java 是否保证 线程 A 在将数组引用存储在 AtomicReference 之前对数组元素所做的更新将始终对 线程 B 获取此引用? 换句话说,执行此操作的可能输出是什么: class Refe
使用 AtomicReference 的惰性初始化单例的实现是否正确?如果不是 - 可能的问题是什么? import java.io.ObjectStreamException; import jav
我希望懒惰地创建一些东西并将结果缓存为优化。下面的代码是否安全高效,或者是否有更好的方法来做到这一点?这里需要比较和设置循环吗? ... AtomicReference fCachedValue =
假设我有一个 AtomicReference对象列表: AtomicReference> batch = new AtomicReference>(new ArrayList()); 线程 A 将元素
java AtomicReference 是如何工作的?我试着查看代码,但它是基于 sun.misc.Unsafe 的,所以可能另一个问题是 Unsafe 是如何工作的? 最佳答案 这是特定于当前实现
注意:这个问题与内存可见性有关,而不是“公共(public)”、“私有(private)”等。 假设我有以下类(class): public class Data { public final
我必须同步线程之间对共享对象的访问,该共享对象的状态由多个字段组成。说: class Shared{ String a; Integer b; //constructor, getters and s
什么相当于: AtomicReference ref = new AtomicReference( ... ); 但没有同步成本。请注意,我确实想将引用包装在另一个对象中。 我查看了扩展 Refere
我对 AtomicReference 有一个简单的一般性问题。 如果引用分配在 java 中是原子的,为什么要使用 AtomicReference? 另外我想问一下在 64 位 VM 中引用分配是否是
Java AtomicReference#getAndSet 的用例是什么?换句话说,如果我在代码中使用的来自 AtomicReference 的唯一方法是 AtomicReference#getAn
这个问题已经有答案了: Java volatile reference vs. AtomicReference (6 个回答) 已关闭 6 年前。 如果一个类有一个私有(private) Atomic
我是一名优秀的程序员,十分优秀!