在java中使用volatile关键字的完整示例?

use*_*683 6 java volatile

我需要一个volatile在java 中使用关键字的简单示例,由于不使用而表现不一致volatile.

挥发性使用的理论部分对我来说已经很清楚了.

aio*_*obe 13

首先,由于非易失性变量,没有保证暴露缓存的方法.您的JVM可能对您始终非常友好,并有效地将每个变量视为易失性.

话虽如此,有几种方法可以增加线程缓存自己版本的非易失性变量的可能性.这是一个在我测试过的大多数机器上公开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.");
    }
}
Run Code Online (Sandbox Code Playgroud)

该程序通常只会输出

keepRunning set to false.
Run Code Online (Sandbox Code Playgroud)

并继续运行.使keepRunningvolatile变得可以打印

keepRunning set to false.
Thread terminated.
Run Code Online (Sandbox Code Playgroud)

并终止.

  • +1.与我的答案相同,但越来越精细 (2认同)
  • 有趣的是,如果你让循环做一些事情,那么这个例子就不再适用了(例如``System.out.println(".");````while(keepRunning)` (2认同)