volatile变量修改后会立即刷新到内存,每次访问volatile变量会重新从内存中读取  保证了可见性(这个我理解)
但是  难道普通变量修改后不会立即刷新到内存中吗??线程读取普通变量时(工作内存中已经有)直接读取工作内存中的拷贝,但是什么时候知道工作内存的变量已经失效了呢??不能一直读拷贝吧???  希望得到大家的指教!!!

解决方案 »

  1.   

    volatile变量一旦修改,会直接写主存,同时cpu会让使用此变量的缓存行失效,使用时重新从主存读取。适合一写多读的场景
      

  2.   

    并发编程 之 volatile 关键字http://www.verejava.com/?id=1734028422785
      

  3.   

    因为CPU有一级二级甚至三级缓存
      

  4.   

    不好意思 我表达有点不清晰。 我的意思是普通变量在线程中更改后,工作内存的数据难道不会立即写到内存中吗???假如说普通共享变量a,在线程中工作内存中都有a的拷贝,当线程1修改a的时候 a的修改指会立即刷新到主内存(共享内存)???还有一个问题线程2什么时候知道自己的工作内存中a的拷贝失效?????volatile我知道 会立即刷新到共享内存中,并且通知别的线程变量失效,线程每次访问volatile变量都是直接去共享内存中读取!!想的脑壳疼!!哈哈  
      

  5.   

    volatile在修改时才会使各个线程的变量失效一次,并不是每次。线程如果已经拷贝了变量,除非接到失效通知,否则就一直读取旧值,但是如果线程里有阻塞方法什么的,还是会读取主内存的变量(我的理解是反正闲着也是闲着),基于1.8。我测试发现1.6是每次尽量读取最新的值,不加volatile有些场景竟然也没有问题。