测试现象1: "========吕李阳 pk 郭德恩========" 永远不会被打印:

测试现象2: 修改"========吕李阳 pk 郭德恩========" 会被打印

public class TestVolatile {
public static void main(String[] args) {
Gs gs = new Gs();
gs.start();
while(true){
if(gs.isFlag()){
System.out.println("========吕李阳 pk 郭德恩========");
}
}
}
}


class Gs extends Thread{
//private volatile boolean flag = false; // 测试现象1行

private boolean flag = false; // 测试现象2行

public boolean isFlag() {
return flag;
}
@Override
public void run() {
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
flag = true;
System.out.println("flag = " + flag);

}
}

每个线程操作数据的时候会把数据从主内存读取到自己的工作内存,如果他操作了数据,其他已经读取的线程的变量副本就会失效了,需要都数据进行操作又要再次去主内存中读取了。

volatile保证不同线程对共享变量操作的可见性,也就是说一个线程修改了volatile修饰的变量,当修改写回主内存时,另外一个线程立即看到最新的值。