【发布时间】:2012-06-01 14:37:00
【问题描述】:
我需要一个在 Java 中使用 volatile 关键字的简单示例,由于不使用 volatile 而导致行为不一致。
volatile用法的理论部分我已经很清楚了。
【问题讨论】:
-
如果您已经了解理论,为什么不尝试一下?
我需要一个在 Java 中使用 volatile 关键字的简单示例,由于不使用 volatile 而导致行为不一致。
volatile用法的理论部分我已经很清楚了。
【问题讨论】:
首先,由于非易失变量,没有保证公开缓存的方式。您的 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/…