安全地发布数组元素

时间:2016-04-14 17:51:49

标签: java arrays multithreading

这个问题涉及在多线程java程序中安全发布数组内容。

假设我有一些任意数组的对象:

Object[] myArray = ...

现在这个数组被移交给另一个线程,可能是这样的:

new Thread() {
    public void run() {
        // ...
        Object o = myArray[0];
        // ...
    }
};

我的问题是,新线程是否会观察到数组中的值为“预期”和“#39;如果没有进一步的同步?这取决于数组本身是(最终/易变)字段还是局部变量?从第一个线程对数组的后续修改是否立即可见到新线程? 什么是安全发布数组元素的最有效方法?

1 个答案:

答案 0 :(得分:1)

确切的答案取决于数组及其内容的可变性,编写者和读者的数量,是否唯一的选择是使用数组(而不是相同元素的线程安全Collection),等

如果我在你的鞋子里,我可能会花一个晚上在StackOverflow中搜索并尝试一些奇特的模式组合(可能是final数组引用加上数组元素的不可变包装器,或者自定义如果有单个作家,则使用Unsafe.putOrderedObject更新方案。

然后在短暂的内部斗争之后,我将所有这些都复制到我的" Playground"文件夹并使用AtomicReferenceArrayCopyOnWriteArrayList(或其他适当的现成解决方案)。

我还要提醒自己,当我解决所有更大的问题(比如正确性)时,以及当我有这个的证据时,我需要担心性能问题我的程序的特定部分需要进行优化。希望类似的方法也适合你。