volatile
最終更新日15 Jul 2015 07:16
英語の意味を調べると、volatileは「揮発性の」という意味です。
オブジェクトの値が言語によって規定されていない形で変更される可能性があるため、積極的な最適化を避けなければならないことをコンパイラに知らせるヒントである。
volatileが適用された変数の値がコード中で更新されなくても外部から変更され得るということをコンパイラに知らせるものです。
外部からの変更はオペレーティングシステム、ハードウェア、あるいは他のスレッドによって行われます。
値が突然変更される可能性があるため、毎回メモリから値を読み込むようにコンパイルされます。
volatileは排他制御を保証するものではありません、
volatile修飾子のついた変数は、どんなスレッドからアクセスされても、常に最新の更新された値を読む
という特徴があります。
volatileは何の役に立つ?
コンパイラによって自動的にされる最適化が気に食わないときにvolatileを使うらしい。
たとえばこういうコードを書いた場合、
int opt=1; void Fn(void){ start: if(ope == 1) goto start; else break; }
コンパイラはこんな風に最適化します
void Fn(void){ start: int opt=1; if(true) goto start; }
これじゃあ無限ループになってしまいますね。
このプログラム、外部の操作でopt==0になるときがあるから、最適化してくれなくていいんですけど!!!
コンパイラさんにはそんな私の事情なんか、わからないよね~
という状況だったとします。そんな時、volatile変数の出番です。
volatile修飾子をつけて、このoptという値が外部から変更されうるってことを知らしめてやるのです!
volatile int opt=1;//<-volatile修飾子をつける void Fn(void){ start: if(opt==1) goto start; else break; }
グローバル変数を持つマルチスレッドプログラムで、どのスレッドからもその変数を変更できる場合にも役に立つらしい。
Bibliography
java-keyword thread