next up previous
Next: 16.10 プリエンプション Up: 16 スレッドのスケジューリング Previous: 16.8 優先順位

16.9 volatile

priority.javaのgoflagデータには,volatileという指定がなされている. たとえば,

currentValue = 5;

for (;;) {
    display.showValue(currentValue);
    Thread.sleep(1000);
}
というような場合に,currentValueの値をshowValueが変更する 方法がなければ,コンパイラーはfor文のループの中では currentValueは変更されないとして取り扱って,showValueを 呼び出すごとに定数5を使ってよいと判断してしまうかも しれない.しかし,もし,ループが実行されている間に currentValueが他のスレッドにより更新されるフィールドだと すれば,コンパイラーの仮定は間違いということになる. コンパイラは,同期されたコード内でのフィールドのアクセス に関してはこのような仮定は許されていないので,この問題は 解決される. 同期をしないでこの問題を解決する方法としてvolatileを使うという 方法がある. volatileを変数につけることによって,コンパイラが知らない時に値が 変更されることがあるということを指定することができる. 今の場合,currentValueをvolatileと宣言することによって,コンパイラーはルー プの中で毎回その値を読み直すことを強制することになる. これによってvolatile変数の呼び出しは常に最後に書かれた値を返す. マイコンの組込みプログラムの場合にも同様なことが起こる. たとえば,カウンタやステータスレジスタを変数でアクセスできるようにした 場合に,その変数の値がカウンターによって自動的に変わって いる場合に,コンパイラがその変数がそのように書き換えられている ということを知らないと,上のような無駄なループ文などで コンパイラの最適化処理によって値が変化していないと勝手に 判断してカウンタやステータスレジスタの値を実際に読み取る ことを行わないコード生成をしてしまうことがある. そのために,ANSI C言語でも,volatileというキーワードをつける ことができる.

generated through LaTeX2HTML. M.Inaba 平成18年5月7日