通过易失性引用安全地发布对象数组

时间:2014-06-04 09:29:44

标签: 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 
        }
    }
}

发生在之前是否适用于每个新创建的对象或仅适用于数组本身?

即使在j内保留MyObject的字段不是final

1 个答案:

答案 0 :(得分:2)

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

反例:如果您在array之后的早期发布new MyObject[16],那么在循环中的写入之前发生 - 并且通过已发布的参考读取将不存在。< / p>