以下代码是否可以安全发布?
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/