1

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

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 here 适用于每个新创建的对象还是仅适用于数组本身?

就算j里面会容纳的领域MyObject不是final

4

1 回答 1

2

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

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

于 2014-06-04T09:58:00.533 回答