gpt4 book ai didi

java - volatile 数组的替代品

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:52:57 25 4
gpt4 key购买 nike

从其他问题中了解到volatile数组的元素不是volatile的。只有引用本身是易变的。

volatile[] int data;

Thread A: data[4] = 457;
Thread B: System.out.println(data[4]);

在这里,线程 B 可能永远看不到更新后的值。

为了达到同样的目的,我必须有哪些选择/备选方案?我想避免必须同步数组,因为它几乎从未改变过。但是,某些线程正在大量阅读它。同步它很可能会降低吞吐量,这在本例中非常重要。

我唯一的选择是写时复制数据结构吗?即,将数组复制到一个新数组中,然后更新数组引用。

还有其他选择吗?我在某处读到将数组封装到一个类中(只有一个成员,数组)实现了同样的事情,但我怀疑这是真的。我看不出这有什么帮助。

请注意,我的目标 JVM 是 1.4。这意味着我无法使用 java.util.concurrent 包。

----------------编辑编辑编辑----------------

Java volatile array?我读到重新分配数组引用可以实现易变性语义。这应该给出正确的结果:

volatile[] int data;

Thread A: data[4] = 457;
Thread A: data = data;
Thread B: System.out.println(data[4]);

这对旧的 JVM 有效吗?

最佳答案

一个数组被标记为volatile,即只有引用被标记为volatile。 array 本身的元素根本不继承 volatile 关键字的内存可见性语义。

我可以建议您自己构建一个 AtomicIntergerArray 类。您可以在哪里保留 final int[] 数据 引用并正确同步它。

另请查看 AtomicIntergerArray implementation code .

否则你可以使用Backport apiAtomicIntegerArray .

该项目旨在提供一个并发库,该库可在当前使用的所有 Java 平台上以不折不扣的性能运行,从而允许开发完全可移植的并发应用程序。更准确地说,目标范围是 Java 1.3 及更高版本,如果为 Java 1.2 提供一些有限支持。

关于java - volatile 数组的替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15739942/

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