private final Point p;
void synchronized setPoint(int x, int y) {
p.x=x;
p.y=y;
}
Point getPoint() {
return p;
}
あるクラスAが最終参照フィールドPoint pを持つとします。オブジェクトのフィールドはJVMによってキャッシュできますか?
ポイントpオブジェクトは、クラスAコンストラクタで作成されます。
クラスAはスレッドセーフである必要があるため、pの内部フィールドを変更する同期化setter setPointがあります。
参考文献は最終的なので、マルチスレッド環境で参照自体を読むことについては気にする必要はありません。しかし、オブジェクトの内部データはどうですか?
JVMはpの内部データを実行中のスレッドのキャッシュに格納できますか?
一般に、JVMはヒープ(スタックではなく)からキャッシュにデータを格納しますか?もしそうなら、揮発性キーワードは参照自体にのみ影響し、参照オブジェクトには影響しないので、どのようにそのようなフィールドを扱うべきですか?それとも、ゲッターを残しても問題ないですか?
クイックアンサー:データを読み取るときに同期を使用してください。セットで同期するだけでスレッドのバグが発生します。 –