java valitale_java volatile

volatile关键字解析

这个关键字去网上查资料,都只是说不能保证原子性,又说有可见性,说的还是模模糊糊,例子都特么一模一样,让人读了还是不知道为啥,其实究其原因就是只叙述了一半,为啥不是线程安全的要点没有讲解的,我有幸翻到一篇博客写的很详细,非常不错,贴链接参考。我先膜拜下,写博客就的究其因,述其果。盗大佬的一张图再说。

2ce9f3617cf07a5cdcb3f1b6fb3d0375.png

有大佬的博客,我就直接按照我自己的理解来叙述一遍:

volatile保证可见性,即变量更新后,立即刷新至主内存,其余线程可以读取到最新的变量(网上都只说这么点东西).但是,如果此时A、B两线程都去读取并修改此变量,可能会出现一种现象,即A、B线程同时读取变量,假设此时变量T值是0,A、B两线程都读取到变量T为0,然后进行计算,A线程计算+1操作结果为1 写入变量,并刷新至主内存,线程B已经读取到变量,读取时线程A并没有及时修改,所以线程B也会拿0计算+1,并写入主内存,结果就是变量T为1。所以不能保证线程同步问题,线程同步即线程串行处理就不会出现此问题。

适用场景:我觉得貌似只有网上大部分的例子那种场景会用到,一个线程依赖另一个线程的修改结果。实际场景老实加锁处理,大佬们都说了,现在的锁性能已经非常不错了,而需要用到volatile关键字的地方,不是超级频繁,也不会有问题。不过了解下原因就行。

volatile特性

1、保证此变量对所有的线程的可见性,这里的“可见性”,如本文开头所述,当一个线程修改了这个变量的值,volatile 保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新。但普通变量做不到这点,普通变量的值在线程间传递均需要通过主内存(详见:Java内存模型)来完成。

2、禁止指令重排序优化。有volatile修饰的变量,赋值后多执行了一个“load addl $0x0, (%esp)”操作,这个操作相当于一个内存屏障(指令重排序时不能把后面的指令重排序到内存屏障之前的位置),只有一个CPU访问内存时,并不需要内存屏障;(什么是指令重排序:是指CPU采用了允许将多条指令不按程序规定的顺序分开发送给各相应电路单元处理)。

volatile 性能:volatile 的读性能消耗与普通变量几乎相同,但是写操作稍慢,因为它需要在本地代码中插入许多内存屏障指令来保证处理器不发生乱序执行。

volatile参考链接:http://www.cnblogs.com/mengheng/p/3495379.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值