public class VolatileExample extends Thread{
         //设置类静态变量,各线程访问这同一共享变量
        private static boolean flag = false;      
        //无限循环,等待flag变为true时才跳出循环
         public void run() {while (!flag){};}
         public static void main(String[] args) throws Exception {
            new VolatileExample().start();
            //sleep的目的是等待线程启动完毕,也就是说进入run的无限循环体了
            Thread.sleep(100);
            flag = true;
        }
    }
预计效果->程序正常结束
实际效果->程序死循环
解决方案->volatile 修饰变量
作用:
  • 线程对变量进行修改之后,要立刻回写到主内存。
  • 线程对变量读取的时候,要从主内存中读,而不是缓存。

 

 上面代码,主线程获取变量值到工作内存中,修改了变量后,并刷新到主内存中,但是,VolatileExample线程从主内存中复制的变量并未得到变量已经修改的通知,导致了多线程情况先变量不可见性。