我试图准确了解元素可见性如何在 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);
}
}
以及以下用于创建实例的方法体:
int[] array = new int[length];
fillArrayWithRandomData(array); // puts data into the array from arbitrary source
return new IntList(array);
我想知道 中的元素IntList
是否保证被其他获得对返回的引用的线程可见IntList
?
我确信对数组的引用将是可见的,因为它是最终的,但我似乎无法保证数组中的元素也可见。
注意:IntList
该类没有允许修改数组的方法,并且数组引用不会发布到任何其他对象,我只是想知道构造后的可见性。
编辑:对不起,我的课程String
在我的实际实现中没有被调用。我将班级名称更改为,IntList
因为似乎有太多的混乱。
编辑:
我要在这里给出的最终答案是是的,元素是可见的。
@MikeClark 找到了 JLS 的答案:JLS § 17.5 “最终字段的使用模型很简单:在该对象的构造函数中设置对象的最终字段;并且不要将正在构造的对象的引用写在另一个线程可以在对象的构造函数完成之前看到它。如果遵循这个,那么当另一个线程看到该对象时,该线程将始终看到该对象的最终字段的正确构造版本。它还将看到任何对象的版本或由至少与最终字段一样最新的最终字段引用的数组。”
再次感谢!