示例代码:
/** * @author huxin * 创建时间:2021/5/3 */ public class VolatileTest { public static /*volatile*/ boolean flag = false ; public static void main(String[] args) throws Exception{ new Thread( ()->{ System.out.println("______begin__________"); while (!flag){ } System.out.println( "----------end---------"); }).start(); Thread.sleep( 2000l); //这一句确保第一个线程在自己的工作内存上读到flag变量 new Thread( ()->{ prepareData(); }).start(); } public static void prepareData(){ System.out.println("prepare set flag to true"); flag = true ; System.out.println("finish set flag to true"); } }
以上代码,如果不加 volatile 关键字,while(!flag)会一直等待,说明它的flag值为false,从而验证了另一个线程更新了共享变量它没读到.