Java阵列同步(可见性)

nik*_*pen 10 java arrays synchronization

我试图准确理解元素可见性如何在java中的数组上工作.

鉴于课程:

class IntList {

    private final int[] array;

    public IntList(int[] array) {
        this.array = array;
    }

    public int[] readElements() {
        return Arrays.copyof(this.array, this.array.length);
    }

}    
Run Code Online (Sandbox Code Playgroud)

以及用于创建实例的以下方法体:

int[] array = new int[length];
fillArrayWithRandomData(array); // puts data into the array from arbitrary source
return new IntList(array);
Run Code Online (Sandbox Code Playgroud)

我想知道是否IntList保证其他线程可以看到元素获取对返回的引用IntList

我确信数组的参考将是可见的,因为它是最终的,但我似乎无法保证数组中的元素也是可见的.

注意:IntList该类没有允许修改数组的方法,并且数组引用未发布到任何其他对象,我只是想知道构造后的可见性.

编辑:对不起,String在我的实际实现中没有调用我的类.我改变了类名,IntList因为似乎有太多的混乱.

编辑: 我将在这里放置的最终答案是肯定的,元素是可见的.
@MikeClark找到了JLS答案:JLS§17.5"最终字段的使用模型很简单:在该对象的构造函数中设置对象的最终字段;并且不要在另一个地方写入正在构造的对象的引用线程可以在对象的构造函数完成之前看到它.如果这样,那么当另一个线程看到该对象时,该线程将始终看到该对象的最终字段的正确构造版本.它还将看到任何对象的版本或由最终字段引用的数组,这些字段至少与最终字段一样是最新的."

再次感谢!

Abd*_*aly 2

既然您正在构造函数中填充数组,那么是的,任何调用都会new String(int[] array)在返回时初始化数组。该关键字还将保证分配时对参数的final最新更改可见。array

  • JLS § 17.5 “final 字段的使用模型很简单:在该对象的构造函数中设置该对象的 Final 字段;并且不要将对正在构造的对象的引用写入到另一个线程可以在该对象的构造函数之前看到它的位置。构造函数完成。如果遵循此操作,那么当另一个线程看到该对象时,该线程将始终看到该对象的最终字段的正确构造版本。**它还将看到这些最终引用的任何对象或数组的版本至少与最终字段一样最新的字段**。” (4认同)