Java-volatile
代码: package jvm; public class VolatileVisibilityTest { private static boolean initFlag = false; // private static volatile boolean initFlag = false; public static void main(String[] args) throws InterruptedException { new Thread(new Runnable() { public void run() { System.out.println("waiting data....."); while(!initFlag) { } System.out.println("success....."); } }).start(); Thread.sleep(2000); new Thread(new Runnable() { public void run() { prepareData(); } }).start(); } public static void prepareData() { System.out.println("prapareing data......"); initFlag = true; System.out.println("prapareing data end......"); } } 1.不使用volatile,运行结果: waiting data..... prapareing data...... prapareing data end...... ?2.使用volatile,运行结果: waiting data..... prapareing data...... prapareing data end...... success..... ? JMM数据原子操作
? voliate缓存可见性实现原理: 底层实现主要是通过汇编lock前缀指令,它会锁定这块区域内的缓存(缓存行锁定)并会回写到主内存。 IA-32架构开发者对lock指令的解释: 1)会将当前处理器缓存行的数据立即写会系统主存 2)这个写回内存的操作会引起在其他cpu里缓存了该内存地址的数据无效(MES协议) 线程2将initFlag的值store到主内存时要通过总线,cpu总线嗅探机制监听到initFlag值被修改,线程1的initFlag失效,线程1需要重新read initFlag的值。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |