直接上代码
public class Test {
public static boolean flag = true;
public static class T1 extends Thread {
@Override
public void run() {
System.out.println("线程运行中");
while(flag) {
;
}
System.out.println("线程结束");
}
public static void main(String[] args) throws Exception{
T1 t1 = new T1();
t1.start();
Thread.sleep(1000);
flag = false;
}
}
}
这段代码的运行后,会在while循环里死掉,即使在主线程中把flag设置为false了也不行,原因是子线程t1没有感知到主线程对flag的修改,但是修改为下面代码后就能感知到了
将
public static boolean flag = true;
修改为
public static volatile boolean flag = true;
这样主线程修改flag后会立即将flag刷新到主内存,t1线程在读取flag时也会先从主内存中拷贝副本,从而能感知变化