注意::这个问题与内存可见性有关,而不是“公共”、“私人”等。
可以说我有以下课程:
public class Data {
public final byte[] array;
public final int offset, length;
public Data(byte[] array, int offset, int length) {...}
...
}
(上述数组中的元素可以通过未显示的方法进行更改。)
现在假设我在另一个类中有一个包含给定数据的队列:
final ConcurrentLinkedQueue<Data> queue = new ConcurrentLinkedQueue<>();
现在假设我在带有队列的类中有以下代码:
Data data = queue.poll();
... code for reading the elements in the data object.
我的问题是:在轮询队列之前设置的数组中的元素是否保证对从队列中轮询数据的线程可见?
我知道队列轮询之后设置的元素对读者是不可见的,我只对队列轮询之前设置的元素感兴趣。
如果不是,我的理解是在调用 poll 方法之后放置的以下代码将确保数组的可见性
data = new Data(data.array, data.offset, data.length);
因为对象构造确保对象字段的完全可见性。它是否正确?
谢谢!