public class VolatileTest {
/**
* volatile的实现原理
* 在生成汇编代码时,对于被volatile修饰的变量,进行写操作时会多出lock前缀的指令。
* 这个指令所带来的影响:
* 1.将当前处理器缓存行的数据写回主内存。
* 2.这个写回主内存的操作会是其他内存中改变量的内存地址失效。
*
* 如果对声明了volatile的变量进行写操作,jvm会向处理器发送一条lock前缀的指令,将这个变量
* 所在缓存行中的数据写回到主内存中。同时时其他线程中改变量的内存地址失效。当其他线程对改变量进行
* 写操作时,会发现其缓存中的变量的地址已失效,就回去主内存中重新读取改变量的值到处理器缓存中。
*/
private static volatile boolean flag = false;
public static void main(String[] args) {
Thread aThread = new Thread(new Runnable() {
public void run() {
while(!flag){//线程读取flag=false
System.out.println(flag);
}
}
});
aThread.start();
try {
Thread.sleep(1000);//主线程睡1秒
flag = true;//修改主线程flag 此时aThread的缓存中的flag失效,需要重新读取flag flag = true;循环结束。
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}