从其他问题中,我了解到 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[] int data;
Thread A: data[4] = 457;
Thread A: data = data;
Thread B: System.out.println(data[4]);
这在较旧的 JVM 上有效吗?