volatile关键字总结

来源:互联网 发布:linux copy命令不覆盖 编辑:程序博客网 时间:2024/05/22 11:41

Thinking in java中volatile关键字内容总结

第一部分 volatile保证可视性

原子性可以应用于处long和double之外的所有基本类型之上的“简单操作”,但是JVM可以将64位的读取和写入当作两个分离的32位操作来执行(字撕裂)。
当你定义long或double变量时,使用volatile,就会获得原子性

在多处理器系统上,相对于单处理器系统而言,可视性问题远比原子性问题多得多。一个任务做出的修改,即使在不中断的意义上讲是原子性的,对其他任务也可能是不可视的。
如,修改只是暂时性地存储在本地处理器的缓存中,因此不同的任务对应用的状态有不同的视图。

volatile关键字保证了应用中的可视性。如果你将一个域声明为volatile的,那么只要对这个域产生了写操作,那么所有的读操作就都可以看到这个修改,即便使用了本地缓存,情况也是如此,volatile域会直接写到主存中。
非volatile域上的原子操作不必刷新到主存中去,因此其他读取该域的任务可能看不到这个新值。

如果多个任务同时访问某个域,那么这个域就应该是volatile的,否则,这个域就应该只能经由同步来访问。同步机制也会导致在主存中刷新,因此如果一个域有synchronized方法或语句块来防护,不必使用volatile。

第二部分:volatile和synchronized的区别


不同
在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,
因此volatile变量是一种比sychronized关键字更轻量级的同步机制。

相同都是
保证了写入和读取都直接操作内存,不会进行内存的重排序或CPU cache等操作,保证可视性

使用volatile而不是synchronized的唯一安全的情况是类中只有一个可变的域

第三部分:volatile不能解决“原子性操作但是仍需要同步控制”的问题

“原子操作不需要进行同步控制”是不正确的。
尽管某个操作是原子性操作,但是仍有可能在其处于不稳定的中间状态时被读取。
在没有同步的情况下对共享可变值进行了访问,即使共享可变值设置为volatile,解决了多任务的可视性问题
但仍有可能在其处于不稳定的中间状态时被读取。
解决方案是添加同步控制

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 京东上面买的商品不符合实际怎么办 在京东买东西卖家迟迟不发货怎么办 淘宝商家买的货一直不到怎么办 国美买的格力空调发票丢了怎么办 国美实体店发票丢了怎么办 我在苏宁买的冰箱发票丢了怎么办 信用卡家庭电单位电话换了怎么办 常住户囗和实际住址没房子怎么办 退货淘宝极速退款 卖家拒收怎么办 淘宝退货极速退款后卖家拒收怎么办 蘑菇街付款成功怎么申请退款怎么办 淘宝上拍错地址联系卖家不管怎么办 收到货想退款卖家不同意怎么办 小米小店复合通过qq群怎么办 买了火车票在订单上查不到怎么办 用支付宝付款扣款没成功怎么办 在京东买东西只收到空盒子怎么办 魅族移动数据是灰色的怎么办? 魅族手机账号密码忘记了怎么办视频 淘宝购物退货把单号写错了怎么办 天猫想退货商家不给退货地址怎么办 天天爱消除四星宠物等级已满怎么办 店不干了店里面的财神怎么办 微信显示登陆注册语言打不开怎么办 三星手机解锁以后突然不量怎么办 耐克、阿迪品牌鉴定买到假货怎么办 小米4c盒子不支持有线连接怎么办 一个手机号绑着两个小米账号怎么办 小米5s手机听筒声音小怎么办 淘宝上买手机买到翻新怎么办 小米6用久了很卡怎么办 淘宝商家发错误的退货地址怎么办 买苹果手机时查到了翻新机该怎么办 荣耀9青春版玩王者卡怎么办 红米4x手机声音突然成破音怎么办 红米pro玩王者荣耀卡怎么办 红米手机恢复出厂设置出错了怎么办 红米恢复出厂设置出错了怎么办 应聘工作上当收押金了该怎么办 红米1s密码忘了怎么办 红米1s刷机后开不了机怎么办