java - 通过 volatile 引用安全发布对象数组

标签 java concurrency volatile happens-before

以下代码是否可以安全发布?

public MyThread extends Thread {
    @Override
    public void run(){
        for(int i=0; i < 100; i++){
            MyObject[] array = new MyObject[16];

            for(int j=0; j < 16; j++){
                array[i] = new MyObject(j);
                array[i].memberAttribute++;
            }

            // At this point the array is assigned to a shared volatile 
            // MyObject[] ref or put inside a concurrent collection 
        }
    }
}

这里的“Happens-before”适用于每个新创建的对象还是仅适用于数组本身?

即使 MyObject 中保存 j 的字段不是 final

最佳答案

是的,这是一个安全的发布,假设您之后也正确读取了对数组的引用(例如,通过相同的 volatile 变量,或在相同的锁下,或来自相同的集合)。代码中对数组和 MyObject 的所有写入都发生在对已发布的引用进行任何读取之前,包括读取数组元素。

反例:如果您很早就发布了 array,例如在 new MyObject[16] 之后,那么在循环中的写入和通读已发布的引用文献将不存在。

关于java - 通过 volatile 引用安全发布对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24033787/

相关文章:

java - 同步对类字段的访问

java - 并发和按顺序从 2 个服务器下载 block - Android

c# - 为什么即使使用 Monitor 时,并非所有成员变量都需要 volatile 以保证线程安全? (为什么这个模型真的有效?)

compiler-construction - 何时将 volatile 与共享 CUDA 内存一起使用

java - 在 Eclipse 中运行动态项目是否必须使用 Bootstrap 配置?

java - 如何使用 2 个可用按钮中的一个按钮调用 FileExplorer.java?

java - 如何在多线程代码中避免ConcurrentModificationException

c - 赋值表达式和 volatile

java - java中控制vlc进程

java - 打开其中一个解决项目时,Eclipse中的“解决工作空间 Artifact ”选项会生成错误