java - 安全发布数组元素

标签 java arrays multithreading

这个问题与多线程 java 程序中数组内容的安全发布有关。

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

Object[] myArray = ...

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

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

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

最佳答案

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

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

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

我还会提醒自己,当我解决了所有更大的问题(如正确性),并且当我有证据证明这个特定部分时,我需要担心性能我的程序需要优化。希望类似的方法也适用于您。

关于java - 安全发布数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36630463/

相关文章:

java - 使用java备份mysql数据库而不丢失可移植性

java - 如何在 Java 中读取另一个 map 中的 map ?

javascript - Angular 2 数组打印在控制台上,但无法在屏幕上打印对象属性

arrays - 渴望加载、ArrayResult 和 Doctrine 2

c# - .NET 多线程 : Lock object with log when locked for to much time

c# - 抽象类 MouseAdapter 与接口(interface)

ios - 在添加新值之前用逗号映射 Swift 数组

c# - 线程无法访问对象

c# - Thread.Sleep() 的替代品

java - AnnotationSet 方法 get 不返回集合