【问题标题】:Complete example for use of volatile key word in Java?在 Java 中使用 volatile 关键字的完整示例?
【发布时间】:2012-06-01 14:37:00
【问题描述】:

我需要一个在 Java 中使用 volatile 关键字的简单示例,由于不使用 volatile 而导致行为不一致。

volatile用法的理论部分我已经很清楚了。

【问题讨论】:

  • 如果您已经了解理论,为什么不尝试一下?

标签: java volatile


【解决方案1】:

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

话虽如此,有几种方法可以增加线程缓存自己的非易失性变量版本的可能性。这是一个程序,它揭示了 volatile 在我测试过的大多数机器中的重要性(改编自 here 的版本):

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.

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

keepRunning set to false.
Thread terminated.

然后终止。

【讨论】:

  • 有趣的是,如果你让循环做某事,这个例子将不再起作用(例如System.out.println("."); inside while(keepRunning)
  • 因为System.out.println(...) is synchronized stackoverflow.com/questions/17748078/…
猜你喜欢
  • 2013-07-18
  • 2016-02-12
  • 2015-02-16
  • 1970-01-01
  • 2012-04-01
  • 2011-02-08
  • 1970-01-01
  • 2020-12-18
  • 2022-01-23
相关资源
最近更新 更多