从其他问题中,我了解到易失性数组的元素不是易失性的。只有引用本身是不稳定的。
volatile[] int data;
Thread A: data[4] = 457;
Thread B: System.out.println(data[4]);
在这里,线程 B 可能永远看不到更新的值。
我必须采取哪些选项/替代方案才能实现同样的目标?我想避免同步数组,因为它几乎没有被改变。然而,它被一些线程大量读取。同步它很可能会降低吞吐量,这在本例中非常重要。
我唯一的选择是写时复制数据结构吗?即,将数组复制到新数组中,然后更新数组引用。
还有其他选择吗?我在某处读到,将数组封装到一个类中(只有一个成员,即数组)可以实现相同的效果,但我怀疑这是真的。我看不出这有什么帮助。
请注意,我的目标 JVM 是 1.4。这意味着我无法使用java.util.concurrent
包裹。
--------------编辑编辑编辑--------------
In Java 易失性数组? https://stackoverflow.com/questions/5173614/java-volatile-array?rq=1我读到重新分配数组引用可以实现波动性语义。这应该给出正确的结果:
volatile[] int data;
Thread A: data[4] = 457;
Thread A: data = data;
Thread B: System.out.println(data[4]);
这在较旧的 JVM 上有效吗?
数组被标记为易失性,即只有引用被标记为易失性。数组本身的元素根本不继承 volatile 关键字的内存可见性语义。
我可以建议建立一个AtomicIntergerArray
你自己的班级。您可以在哪里保存final int[] data
正确参考并同步它。
还看一下AtomicIntergerArray
实现代码 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/atomic/AtomicIntegerArray.java.
否则你可以使用向后移植 API http://backport-jsr166.sourceforge.net/index.php's AtomicIntegerArray http://backport-jsr166.sourceforge.net/doc/api/edu/emory/mathcs/backport/java/util/concurrent/atomic/AtomicIntegerArray.html.
该项目旨在提供一个并发库,该库可以在当前使用的所有 Java 平台上以不受影响的性能运行,从而允许开发完全可移植的并发应用程序。更准确地说,目标范围是 Java 1.3 及更高版本,如果为 Java 1.2 提供一些有限的支持。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)