经典面试题-volatile的作用

  • 线程安全要考虑三个方面:可见性、有序性、原子性

    • 可见性指,一个线程对共享变量修改,另一个线程能看到最新的结果
    • 有序性指,一个线程内代码按编写顺序执行
    • 原子性指,一个线程内多行代码以一个整体运行,期间不能有其它线程的代码插队
  • volatile只能保证共享变量的可见性和有序性,但是不能保证原子性;(volatile一般修饰变量)

  • 可见性
    起因:由于编译器优化(JIT)、或缓存优化、或 CPU 指令重排序优化导致的对共享变量所做的修改另外的线程看不到
    解决:用 volatile 修饰共享变量,能够防止编译器等优化发生,让一个线程对共享变量的修改对另一个线程可见

可见性产生的原因错误理解:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rFCY4lyk-1658275285763)(en-resource://database/1580:1)]

正确理解:
在这里插入图片描述

  • 有序性(指令重排序的情况可以通过jcstress压测工具来测)
    起因:由于编译器优化、或缓存优化、或 CPU 指令重排序优化导致指令的实际执行顺序与编写顺序不一致
    解决:用 volatile 修饰共享变量会在读、写共享变量时加入不同的屏障,阻止其他读写操作越过屏障,从而达到阻止重排序的效果

volatile 变量写加的屏障是阻止上方其它写操作越过屏障排到 volatile 变量写之下
volatile 变量读加的屏障是阻止下方其它读操作越过屏障排到
volatile 变量读之上volatile 读写加入的屏障只能防止同一线程内的指令重排

  • 原子性
    起因:多线程下,不同线程的指令发生了交错导致的共享变量的读写混乱
    解决:用悲观锁或乐观锁解决,volatile 并不能解决原子性
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值