volatile

java 内存模型:

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

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

   

 

1.保证可见性

   

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

    变量声明为 volatile:

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

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

 

 

 

2.原子性

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

 

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

3.编译代码不重新排序

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

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值