这个问题涉及在多线程java程序中安全发布数组内容。
假设我有一些任意数组的对象:
Object[] myArray = ...
现在这个数组被移交给另一个线程,可能是这样的:
new Thread() {
public void run() {
// ...
Object o = myArray[0];
// ...
}
};
我的问题是,新线程是否会观察到数组中的值为“预期”和“#39;如果没有进一步的同步?这取决于数组本身是(最终/易变)字段还是局部变量?从第一个线程对数组的后续修改是否立即可见到新线程? 什么是安全发布数组元素的最有效方法?
答案 0 :(得分:1)
确切的答案取决于数组及其内容的可变性,编写者和读者的数量,是否唯一的选择是使用数组(而不是相同元素的线程安全Collection
),等
如果我在你的鞋子里,我可能会花一个晚上在StackOverflow中搜索并尝试一些奇特的模式组合(可能是final
数组引用加上数组元素的不可变包装器,或者自定义如果有单个作家,则使用Unsafe.putOrderedObject
更新方案。
然后在短暂的内部斗争之后,我将所有这些都复制到我的" Playground"文件夹并使用AtomicReferenceArray
或CopyOnWriteArrayList
(或其他适当的现成解决方案)。
我还要提醒自己,当我解决所有更大的问题(比如正确性)时,以及当我有这个>的证据时,我需要担心性能问题我的程序的特定部分需要进行优化。希望类似的方法也适合你。