6

volatileJavaでのキーワードの使用法を理解するのに混乱しました。私はインターネットで多くの記事を読みましたが、まだどこにも行き着いていません。私の頭の中には、聞きたいことがたくさんあります。

まず第一に、ウィキペディアと多くのブログでは、すべてのvolatile変数はすべてのスレッドで共有されるメイン メモリ上のスレッド ローカル メモリに格納されていると述べています。私は少し混乱していstack memoryます。stack memory各スレッドには、独自のプリミティブリテラルとオブジェクト参照を格納する独自の場所があることを私は知っています。

その場合、volatile変数がプリミティブ リテラルではなくオブジェクト参照である場合はどうなるでしょうか。すべてのオブジェクトは、スタック メモリではなくヒープ スペースに格納されていると思います。

volatile次に、キーワードがどのように機能し、どのような場合に使用するのか、例を挙げて詳しく説明していただけますか?

4

1 に答える 1

11

まず第一に、ウィキペディアと多くのブログでは、すべての揮発性変数はすべてのスレッドで共有されるメイン メモリ上のスレッド ローカル メモリに格納されると述べています。

それは正しくありません。揮発性フィールドはインスタンスまたはクラス (静的) 変数であり、ヒープに格納されます。

彼らは、単一のプロセッサ/コアに固有のキャッシュメモリを参照している可能性があります...しかし、それはハードウェア固有のものです。しかし、これは間違いなく「スレッドローカル」ではありません。その用語は、まったく異なるものを意味します。

もしそうなら、volatile 変数がプリミティブ リテラルではなくオブジェクト参照である場合はどうなるでしょうか?

特にない。あなたの仮定は正しくありません。

揮発性変数はスタックに格納されません。実際、volatileローカル変数にキーワードを使用しようとすると、コンパイル エラーが発生します。(それは意味がありません。スタック上の変数は 1 つのスレッドにのみ表示されます。揮発性セマンティクスは、異なるスレッドによって共有される変数に関するものです。)

各スレッドには、独自のプリミティブ リテラルとオブジェクト参照を格納する独自のスタック メモリがあることがわかっています。

スレッドのスタックに格納されるのは次のとおりです。

  • メソッドのローカル変数
  • メソッドのパラメータ
  • 呼び出しが戻ったときに CPU がどこに行くべきかを知るためのメソッドの戻りアドレスなど、および (おそらく)
  • JIT コンパイラが判断したローカル オブジェクトの状態は、ヒープに格納する必要はありません。

メソッドのプリミティブ リテラルは通常、コード自体に埋め込まれます。文字列リテラルも別の場所にあります。(これらのリテラルがローカル変数に割り当てられると、それらはスタックに保持されます ...)

次に、volatile キーワードがどのように機能し、どのような場合に使用するのか、例を使用して詳細に説明していただけますか?

コメントと関連する質問を確認してください...またはGoogleの「java volatile example」。説明が冗長になります。

于 2013-01-16T03:52:41.523 に答える