これらの使用例に興味があるので、最初の使用例を説明します。これはac/c ++の観点から当てはまることに注意してください。一般に、c / c ++とjavaの揮発性はまったく異なる場合に使用されると思いますが、Javaでどのように機能するかはわかりません。
メモリマップドデバイスは、プロセッサが特別なバスを介さずにメモリと同じ方法で通信する周辺機器です。
メモリマップされたタイマーを備えた小さなライトがあるとします。メモリアドレスに1を書き込むことでライトをオンにすると、内部タイマーが5秒間カウントダウンし、ライトをオフにしてメモリ位置を0にリセットします。現在、特定のイベントの後にライトをオンにする必要があるACプログラムを開発しています。 、および場合によっては、カウンターが期限切れになる前にオフにします。通常の変数(このタイプのアプリケーションのポインターまたは参照の傾向があります)を使用してそのメモリー位置に書き込む場合、コンパイラーの最適化が原因で問題が発生する可能性があります。
それほど多くの変数を使用しておらず、その値を使用する他の変数なしでライトをオンにし、オフにした直後に、コンパイラが最初の割り当てを完全に削除する場合もあれば、削除する場合もあります。プロセッサレジスタの値を維持するだけで、メモリに書き込むことはありません。どちらの場合も、メモリが変更されていないため、ライトwoudlがオンになることはありません。
次に、ライトの状態を確認してオンになっている別の状況を考えてみます。ここで、値はデバイスのメモリから抽出され、プロセッサレジスタに保持されます。さて、数秒後、ライトは自動的に消えます。その後まもなく、ライトを再びオンにしようとしますが、そのメモリアドレスを読み取り、それ以降変更していないため、コンパイラは値がまだ1であると想定し、実際には0になっていますが、変更することはありません。
揮発性キーワードを使用することにより、コードをマシンコードに変換するときにコンパイラーがこれらの仮定を行わないようにし、プログラマーが記述したとおりにすべての特定の操作が厳密に実行されるようにします。これは、メモリの場所がプロセッサによって厳密に変更されないため、メモリマップドデバイスにとって不可欠です。これらと同じ理由で、共有メモリを備えたマルチプロセッサシステムでは、共通のメモリスペースで動作する場合に同様の方法が必要になることがよくあります。