6

I need a simple example of use of the volatile keyword in Java, behaving inconsistently as a result of not using volatile.

The theory part of volatile usage is already clear to me.

4

1 回答 1

13

首先,由于非易失性变量,没有保证公开缓存的方法。您的 JVM 可能一直对您非常友善,并且有效地将每个变量视为 volatile。

话虽如此,有几种方法可以增加线程缓存自己的非易失性变量版本的可能性。这是一个程序,它揭示了 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.");
    }
}

这个程序通常只会输出

keepRunning set to false.

并继续运行。使keepRunningvolatile 导致它打印

keepRunning set to false.
Thread terminated.

并终止。

于 2012-05-26T06:31:16.437 回答