Java のvolatileキーワードについて読んでいて、その理論部分を完全に理解しています。
しかし、私が探しているのは、変数が揮発性でない場合とそうである場合に何が起こるかを示す良い事例です。
以下のコード スニペットは期待どおりに動作しません (ここから取得):
class Test extends Thread {
boolean keepRunning = true;
public void run() {
while (keepRunning) {
}
System.out.println("Thread terminated.");
}
public static void main(String[] args) throws InterruptedException {
Test t = new Test();
t.start();
Thread.sleep(1000);
t.keepRunning = false;
System.out.println("keepRunning set to false.");
}
}
理想的には、 volatilekeepRunning
でない場合、スレッドは無期限に実行し続ける必要があります。ただし、数秒後に停止します。
2 つの基本的な質問があります。
- 誰かが揮発性を例で説明できますか? JLSの理論ではありません。
- 揮発性は同期の代用ですか? それは原子性を達成しますか?