我念叨在Java中volatile关键字,并完全理解它的理论部分volatile关键字的理解的例子。简单,在java中
但是,我正在寻找的,一个很好的案例,这说明如果变量是不挥发会发生什么,如果它是。
低于预期(from aioobe)
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是不挥发,线程应该继续indefinetely运行。但是,它在几秒钟后停止。
我有两个基本问题: -
- 谁能解释挥发性与例子吗?不符合JLS的理论。
- 是同步的易失性替代品吗?它是否实现原子性?
它的一个过去的会谈后广泛http://stackoverflow.com/questions/7212155/ java-threading-volatile – AurA
你正在思考倒退。 *理想情况下,如果keepRunning不是不稳定的,线程应该继续无限期地运行*。实际上,情况正好相反:添加volatile可以保证字段的变化是可见的。没有关键字,根本就没有保证,任何事情都可能发生;你不能说*线程应该继续运行[...] *。 –
以下是这样的事情:内存可见性错误本身很难(不可能?)以演示一个简单的例子,每次都会失败。假设你有一台多核机器,如果你经常运行它(例如1000次运行),你的例子可能会失败至少几次。如果你有一个大的程序 - 例如整个程序和它的对象不适合CPU高速缓存,那么这会增加发现错误的可能性。基本上,并发性错误是这样的,如果理论说它可能会崩溃,它可能会,但每隔几个月就会一次,并且可能在生产中。 – yshavit