注:: この質問はメモリの可視性に関するものであり、「パブリック」、「プライベート」などではありません。
次のクラスがあるとしましょう:
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.
私の質問は次のとおりです。キューのポーリング前に設定された配列内の要素は、キューからデータをポーリングしたスレッドに表示されることが保証されていますか?
キューのポーリング後に設定された要素がリーダーに表示されないことを理解しています。キューのポーリング前に設定された要素にのみ関心があります。
そうでない場合は、ポーリングメソッドを呼び出した後に配置された次のコードが配列の可視性を確保することを理解しています
data = new Data(data.array, data.offset, data.length);
オブジェクトの構築により、オブジェクトのフィールドの完全な可視性が保証されるためです。これは正しいです?
ありがとう!