これらの使用例に興味があるので、最初に説明します。これはc/C++の観点からも当てはまりますが、一般的にはc/C++で揮発性の疑いがありますが、Javaは完全に異なる場合に使用されています。
メモリマップデバイスは、プロセッサが特別なバスではなくメモリと同じ方法で通信するペリフェラルです。
メモリマップされているタイマーで少し明るいとします。ライトをオンにするには、メモリアドレス&に内部タイマーが5秒間カウントダウンします。&は、ライトをオフにしてメモリのロケーションを0にリセットします。次に、特定のイベント後にそのライトをオンにする必要のあるACプログラムを開発していますカウンターが期限切れになる前にそれをオフにすることがあります。メモリ位置に書き込むために通常の変数(このタイプのアプリケーションのポインタまたは参照になりやすい)を使用すると、コンパイラの最適化のために間違っている可能性がある多くのことがあります。
多くの変数で作業していない場合、その値を使用して他の変数を使用せずにライトをオンにしてすぐにオンにした場合、コンパイラは最初の割り当てを完全に取り除くか、それ以外の場合は、単にプロセッサレジスタの値をそのまま維持します。&はメモリに書き込まれません。どちらの場合も、メモリは決して変更されていないため、ライトはオンになりません。
ここでは、光の状態を確認する別の状況を考えてください。&がオンです。この値は、プロセッサレジスタに保持されたデバイスのメモリ&から抽出されます。今、数秒後には、ライトが消えます。まもなく、ライトを再びオンにしようとします。しかし、メモリアドレス&が変更されていないので、コンパイラはその値がまだ1であるとみなします。したがって、実際には0ですが&は決して変更しません。
コードを機械コード&に変換するときに、コンパイラがこれらの前提を行わないようにすることで、プログラマが厳密にすべての特定の操作を確実に実行できるようにします。これは、主にメモリロケーションがプロセッサによって厳密に変更されないため、メモリマップデバイスにとって不可欠です。同じ理由から、共有メモリを備えたマルチプロセッサシステムは、共通のメモリ空間上で動作する場合に、しばしば同様の方法を必要とする。
回答ありがとうございます。 上記の用途でどのようにvolatileが動作するかについての入力はありますか? – Ankur