2017-04-18 2 views
1
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はヒープ(スタックではなく)からキャッシュにデータを格納しますか?もしそうなら、揮発性キーワードは参照自体にのみ影響し、参照オブジェクトには影響しないので、どのようにそのようなフィールドを扱うべきですか?それとも、ゲッターを残しても問題ないですか?

JVM confusing schema on this topic

+4

クイックアンサー:データを読み取るときに同期を使用してください。セットで同期するだけでスレッドのバグが発生します。 –

答えて

1

あなたの質問はあまりにも一般的です。
JVMとは?異なるバージョンのものもたくさんあります。

私はHotSpotとOpenJDK JVM(コードの大部分を読んでいます)に精通していますが、人気のあるCPUのほとんどがすでに効率的に動作しているため、オブジェクトを「キャッシュ」することはありません。

異なるスレッドから共有データを読み書きする場合は、そのフィールド(または複数のフィールド)を​​キーワードと同期させます。可視性と適切なメモリの順序が保証されます。

関連する問題