【问题标题】:Safe publication of array of objects through a volatile reference通过易失性引用安全发布对象数组
【发布时间】:2023-03-12 00:06:02
【问题描述】:

以下代码是否安全发布?

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

【问题讨论】:

  • 向我们展示 MyObject 的定义
  • 不,发生之前仅用于数组访问,不适用于其中的引用恕我直言。
  • 数组是可变对象,所以这个问题是相关的:stackoverflow.com/questions/4614331/…

标签: java concurrency volatile happens-before


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-06-06
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 2019-08-26
    相关资源
    最近更新 更多