Java volatile 怎么保证不被指令重排序优化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_41705780/article/details/79247112

 

内存间交互操作

  • lock: 作用主内存
  • unlock: 作用主内存
  • read/load:这两个操作顺序执行,不能单独出现;主内存的变量=>工作内存的变量
  • use: 作用工作内存,把工作内存变量传给执行引擎
  • assign: 作用工作内存,把执行引擎收到的值赋给工作内存变量
  • store/write: 这两个操作顺序执行;不能单独出现;工作内存的变量=>主内存的变量

通过主内存与工作内存交互来理解这些操作:

注意:

  • 不允许工作内存直接使用未初始化的变量

内存模型的3个特征

  • 原子性
  • 有序性, 同一个线程内观察是有序, 一个线程观察另一个线程的操作是无序的 
  • 可见性

重排序

如下代码,由于threadA对于threadB是无序的,对A重排序优化,②可能提前执行,这就导致threadB跳过④

 
  1. ThreadA {

  2. do something //①

  3. set flag = true//②

  4. }

  5.  
  6. ThreadB {

  7. if(flag){ //③

  8. do something //④

  9. }

  10. }

通过volatile,synchronized可以禁止重排序优化

happens-before(hb)

意义:内存模型通过hb原则并发操作过程中的有序性问题

actionA先行发生actionB,就是说A对B可见(A的结果在B执行时可见)

  • 线程启动/终结规则
  • volatile规则, volatile变量写操作hb后面读操作
  • lock规则, unlock hb lock
  • Order规则, 线程内书写前面的操作hb书写后面的操作
  • 中断规则, Thread.interrupt hb 被中断程序检测到的中断事件的发生
  • 传递性

volatile禁止重排序原理

如下图,1、2保证可见性,3禁止重排序

  • 1.A动作之前必关联P、F动作
  • 2.B动作自后必然伴随G、Q动作
  • 3.A优先于B,则P优先于Q(这个比较显然);B优先于A,则Q优先于P

volatile

例如:线程B对变量flag=true同步优先于A线程使用

volatileflagtrue

volatile深入理解Demo

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值