42

変数への書き込みvolatileがすべての CPU のメモリからフラッシュされることは知っていますが、揮発性変数への読み取りが通常の読み取りと同じくらい高速かどうかを知りたいですか?

変数を CPU キャッシュに配置することはできvolatileますか、それとも常にメイン メモリからフェッチされますか?

4

5 に答える 5

20

この記事をぜひチェックしてください: http://brooker.co.za/blog/2012/09/10/volatile.html . ブログ記事では、x86 での揮発性読み取りは (x86 の場合も) 不揮発性読み取りよりもはるかに遅くなる可能性があると主張しています。

  • テスト 1 は、非揮発性変数への並列読み取りおよび書き込みです。可視性メカニズムはなく、読み取りの結果は古くなる可能性があります。
  • テスト 2 は、揮発性変数への並列読み取りおよび書き込みです。これは、OPの質問に具体的に対処するものではありません。ただし、競合する volatile は非常に遅くなる可能性があることに注意してください。
  • テスト 3 は、タイト ループでの volatile への読み取りです。実証されているのは、揮発性であることの意味のセマンティクスが、ループの反復ごとに値が変化する可能性があることを示していることです。したがって、JVM は読み取りを最適化し、ループから引き上げることができません。テスト 1 では、値が一度読み取られて格納された可能性が高いため、実際の「読み取り」は発生していません。

マーク・ブッカーのテスト

これらのテストを実行してくれた Marc Booker の功績によるものです。

于 2012-09-10T18:21:01.947 に答える
2

アーキテクチャに依存します。volatileその変数を最適化しないようにコンパイラーに指示します。これにより、ほとんどの操作で変数の状態が不明として扱われます。揮発性であるため、別のスレッドまたは他のハードウェア操作によって変更される可能性があります。したがって、読み取りでは変数を再読み取りする必要があり、操作は読み取り-変更-書き込みの種類になります。

この種の変数は、デバイスドライバー、およびメモリ内のミューテックス/セマフォとの同期に使用されます。

于 2009-07-07T05:37:46.150 に答える