浅谈volatile关键字

             今天学习CurrentHashMap源码,发现CurrentHashMap源码中有的属性是用volatile修饰的,别人说volatile可以保证读写的内容是最新的。看到这句话的时候还是满脑子的问号。特地去了解了一下volatile的特性,现在就将了解到的一些内容记录下来,后面有时间会更加深入学习一下。

             1.volatile可以保证在多线程读取的数据是最新的(这句话是有点问题的,后面会解释),因为在多线程对应多核处理器的环境下,每一个线程占用一个处理器,每一个处理器拥有自己的缓存,当线程需要某一个数据的时候,如果这个数据没有被volatile修饰,线程会先从缓存中读取,如果发现在处理器的缓存中存在该数据,就直接读取缓存里的数据,如果没有,才会去内存中读取,对这个数据操作完后,会将操作完的数据放入缓存中,而不是马上放入内存中的。这样就会导致两个线程在同时对某一个数据操作的时候,一个线程对这个数据做出了改变,但是只是将做出改变的数据存入到了自己的缓存里面,而没有存入内存中,另一个线程从内存中读取的数据就不是最新的。如果在数据前面加上volatile就会让线程读取数据的时候强制的从内存中去取,也会在线程对数据做出改变后,就让数据立即更新到内存中。

            2.volatile还拥有hapen-befor性,happens-before 关系是程序语句之间的排序保证,这能确保任何内存的写,对其他语句都是可见的。当写一个 volatile 变量时,随后对该变量读时会创建一个 happens-before 关系。所以,所有在 volatile 变量写操作之前完成的写操作,将会对随后该 volatile 变量读操作之后的所有语句可见。

           3.volatile不能保证数据在多线程下的原子性。这是将数据放入处理器的缓存和放入到内存是两个原子操作,当一个线程对某个数据做出改变,先将这个改变后的数据放入缓存中,但这时刚好有另一个线程从内存中读取了该数据,但是已经改变了的数据却没有被放入到内存中,所以另一个线程读取的数据是有问题的。

         参考文章:http://www.importnew.com/17149.html

                             http://www.cnblogs.com/dolphin0520/p/3920373.html

                            https://blog.csdn.net/lc0817/article/details/51878807  这个讲的比较透彻

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值