`

volatile

阅读更多

java 内存模型:

    主内存:保存对象实例数据、数组等--对所有线程共享。

    工作内存(缓存): 线程私有,线程执行时,从主内存获取变量副本,保存在工作内存,对其进行操作,操作完成之后再写入工作内存。

   

 

1.保证可见性

   

    每条线程执行时都有有自己的工作内存,当对一个变量操作时,会从主内存中取出变量存入线程的工作内存,之后对该变量的读操作一直在线程工作内存中,工作内存中的变量发生变化时会写入主内存,但主内存的变量发生变化(可能由其它线程写入)不一定及时的同步至工作内存中,这样就造成线程读取的变量还是以前的值。 

    变量声明为 volatile:

           读时:每次都从主内存中读取最新的变量值到工作内存,再进行操作。

           写时:每次写操作都把变量值及时同步到主内存中,以使其它线程及时可见。

 

 

 

2.原子性

    volatile 声明的变量本身具有原子性。64位的变量 double,long 如果不声明为volatile,其写入的值可能出错。可能A线程写入高32位,暂停,B线程写入高32位和低32位,A线程继续写入低32位,最终结果是B线程的高32位+A线程的低32位。

 

  另一种方式使用同步锁,但开销有点大。  

3.编译代码不重新排序

   在某种情况下编译器进行优化代码,进行代码重排序(改变代码执行的先后顺序),如果这种重排序会影响代码正确性,则需要将变量生明为volatile,编译器不会对它进行重排序操作。 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics