【发布时间】:2014-03-27 15:01:48
【问题描述】:
看了几篇关于volatile Thread cache的文章,发现要么太简短,没有例子,初学者很难理解。
请帮助我理解下面的程序,
public class Test {
int a = 0;
public static void main(String[] args) {
final Test t = new Test();
new Thread(new Runnable(){
public void run() {
try {
Thread.sleep(3000);
} catch (Exception e) {}
t.a = 10;
System.out.println("now t.a == 10");
}
}).start();
new Thread(new Runnable(){
public void run() {
while(t.a == 0) {}
System.out.println("Loop done: " + t.a);
}
}).start();
}
}
当我创建a 变量volatile 并运行我的程序时,它会在一段时间后停止,但是当我将volatile 删除为a 变量时,它会继续运行,并且我的程序没有停止。
我对 volatile 的了解是“当变量声明为 volatile 时,线程将直接读取/写入变量内存,而不是从本地线程缓存读取/写入。 如果未声明为 volatile,则可以看到实际值的更新延迟。"
另外,根据我对刷新缓存副本的理解,我认为程序会在一段时间后停止,但是为什么在上面的程序中它会继续运行而不是更新。
那么线程引用其本地缓存何时开始引用主副本或用主副本值刷新其值?
如果我的理解有误,请纠正我......
请用一些小代码sn-p或链接解释一下。
【问题讨论】:
标签: java multithreading volatile