volatile 只看一篇就够了

跟synchonized一样。主要讲这玩意能干啥,原理是什么,一般都怎么用
1.这个关键字也是两个作用。 第一个能保证共享变量的可见性。 第二个是阻止指令重排序。
上一篇讲synchonized 举了一个例子。 就是一个共享变量 在两个方法中。一个方法是修改。一个方法是读取。如何保证写的方法中修改了变量值,但是方法还没退出前方法切换到读方法让能读到修改的值。 当时用的是synchonized 强制读方法进不去。只能等到写方法退出后变量刷新。这里要讲第二个方法。就是在这个变量上加volatile 关键字。这个关键字一旦加了。对这个变量的读取或者修改都必须从主内存中去获取。也就是说如果出现刚才那种情况。volatile boolean a 只要执行了a=true.这个ture就会直接
刷新到主内存。 只要读取a 。不管是在哪里都要强制从主内存读取一次。然后copy给工作内存。也就是方法内的变量。这样就不会出现主内存跟工作内存不一致的情况。也就是可见性的问题。但是一定要记住。volatile是不能保证原子性的。哪些是原子操纵
这里再复述一遍 不包含double。long在内的基本类型的赋值。 以及引用类型的赋值。 Object x= new Object()这个操作不是原子性的。切记。最后就是并发类里头的哪几个类的简单操作方法。切记不是所有方法。

2.阻止指令重排序,具体规则如下
a.当程序执行到volatile变量的读操作或者写操作时,在其前面的操作的更改肯定全部已经进行,且结果已经对后
面的操作可见;在其后面的操作肯定还没有进行;
b.在进行指令优化时,不能将在对volatile变量访问的语句放在其后面执行,也不能把volatile变量后面的语句放
到其前面执行。
即执行到volatile变量时,其前面的所有语句都执行完,后面所有语句都未执行。且前面语句的结果对volatile变
量及其后面语句可见。

有点抽象这个规则。 就记住一个例子就好了 Object x= new Object(); 其实是三步 1首先给 x分配一个地址。2 然后new Object()执行对象初始化。 3最后把x指向分配内存的开始位置。。。分配内存是一个原子操作。 地址指向也是一个原子操作。这三个操作是可能会变成 132 这种操作的。 如果变成132 那13完成后 x也不为null。这样x就可以执行别的方法了。但是2没有完成。。。也就是x是一个没有执行完初始化对象,某些初始值估计还没设置。那为撒加了volatile 就一定不会132了。你看规则b。不管是规则a。 还是规则b 都避免了 3在2的前面操作的可能性。还是抽象。所以volatile 变量不好用啊。最后我们来看看jdk都怎么用volatile。

最常见的分析ConcurrentHashMap的源码 。里头众多变量都是volatile 属性。这里主要使用到了变量可见性这个属性。也就是读取修改的时候都要跟主内存同步。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值