先把代码截图,再看下文
// 建议可以代码截图,然后配合文字一起看
public class Test {
static long a= 0; //共享变量
public static void main(String[] args) throws Exception {
Thread work = new Thread(() -> {
while (a== 0) {}
});
work.start(); //工作线程开启
}
}
代码里的变量间的关系如下图,a 是共享变量,在主存,work线程的工作内存有一个主存共享变量a的副本 a1, main线程的工作内存有一个主存共享变量a的副本 a1,线程只能操作自己内存的副本a。
当work的 while循坏的代码块被 JIT激进优化时,由于激进优化的代码块内有个共享变量a,所以,此时,a1=a 这条线断开,即副本a1 无法被主存更新了,但是,无论JIT优化开启与否,a=a1这条线是一定存在的,即工作内存一定可以将自己的副本a1的值赋值给主存的变量a,这个逻辑是恒成立的。
再来看看这段代码
public class Test {
static long a