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