public class TestThread {
private static int 普通变量 = 0;
private volatile static int volatile变量 = 0;
public static void main(String[] args) {
new Thread(){
public void run(){
System.out.println("开始循环");
while(普通变量==0&&volatile变量 ==0){
//System.out.println("12312321312312321");
}
System.out.println("结束循环");
System.exit(0);
}
}.start();
new Thread(){
public void run(){
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("开始赋值");
普通变量 = 1;
}
}.start();
}
}
程序输出:
开始循环
开始赋值
结束循环
正常结束了
但是如果把volatile变量的volatile修饰符去掉,那么程序将会死循环。
这个问题我目前能给出的猜想是,jmm获取volatile变量的同时也会刷新获取非volatile变量的值?
希望并发大神能帮忙回答一下这个问题
这个与硬件的缓存失效机制有关。简单来说缓存失效是按行进行失效,而不是按变量。因为两个变量的定义离得很近,因此在内存/缓存中很可能也是在一起的。这就导致volatile变量失效了缓存的时候连同普通变量一起失效了。