volatile 変数が読み取られると、キャッシュ/レジスタ データがフラッシュされ、RAM (メイン メモリ) から直接読み取りが行われます。これは読み取りバリアと呼ばれます。
Qs 上記のタスクを実行するのは、JVM または OS のどちらですか?
これらのキャッシュ/レジスタはスタック/ヒープの一部ですか?
もう 1 つの質問:
ヒープは JVM (OS によって管理される) によって管理されますか?
Java スタックは (JMV ではなく) OS によって管理されますか?
これがどのように行われるかは、もちろんマシンのハードウェアに依存します。一部のマシンでは、オペレーティング システムに依存する場合もあります。しかし、最近のすべての一般的なプロセッサには、メモリの一貫性を実現するために使用できるユーザーモードコードで使用できる命令があると思います。OS が関与する必要はありません。
私ができるよりもはるかによく説明されている悲惨な詳細については、The JSR-133 Cookbook for Compiler Writers の「Memory Barriers」のセクションを参照してください。
必要な操作が (通常) 実際にはメイン メモリへのフラッシュやメイン メモリからの読み取りではないことを明確にすることは価値があります。すべてのプロセッサ コアのキャッシュが、メイン メモリとまだ一致していなくても、互いに一致していることを確認するだけで十分です。これは、一般に達成するのがはるかに簡単です。