Javaでは全てのスレッドはメインメモリを共有しますが、
性能向上のために各スレッド毎にキャッシュ(作業用メモリ)を作成し、
そこに変数をコピーして処理を行っています。
そのため、あるスレッドがキャッシュ(作業用メモリ)で変更した変数の値と、
別スレッドが参照しているメインメモリ上の変数の値が
異なる(変更された値の同期が取れていない)ことがあります。
volatile修飾子をつけることで、常にその時点での変数の値を参照するようになり、
この問題を回避できます。
どんな時に使えるのか?
マルチスレッド処理において、volatile変数での同期制御はロックよりも扱いが難しく、
あまり推奨されないことが多いようです。
主な使い方としては、プログラム中で1度だけ発生するようなイベントを感知する際の、
単純な真偽値(ステータスフラグ)として使う方法があります。
(例)
`
volatile boolean initFlg = false;
public void someIvent() {
initFlg = true;
}
public void run() {
while (!initFlg) {
// initFlgがtrueになるまでは処理
}
}
`
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。