以下代码是否安全发布?
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
?
答案 0 :(得分:2)
是的,这是一个安全的出版物,假设您之后也正确读取了对数组的引用(例如,通过相同的volatile变量,或在同一个锁下,或从同一个集合中)。在读取已发布的引用之前,所有对数组和代码中MyObject
的写入都会发生,包括读取数组元素。
反例:如果您在array
之后的早期发布new MyObject[16]
,那么在循环中的写入之前发生 - 并且通过已发布的参考读取将不存在。< / p>