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