volatile很难?由浅入深怼到CPU汇编,彻底搞清楚它的底层原理

Tips:最近面试,但凡是个像样的公司面试官都得问我对volatile关键字理解以及其实现原理。虽然多多少少知道一些,但是问深了,终究感觉还是差了那么一点,所以这次我要把这个关键字来学个通透!

本文记录个人学习volatile。主要包含以下内容,力求简单明了:

  1. 一段代码来演示问题背景
  2. volatile解决内存可见性问题
  3. Java内存模型原子操作
  4. 总线加锁太慢?MESI缓存一致性协议(总线嗅探机制)
  5. 彻底掌握volatile底层原理

1、多线程环境下共享变量的线程安全问题

 

点击运行,会有如下输出:

thread1 action...
thread2 action...
thread2 end

可以知道的是,线程1在无限空转,只有当flag=true才会跳出,但是线程2对flag的改变,线程1却感知不到。。。

使用top命令也可以看到有一个Java进程的CPU在100%上下:

 在了解上面的代码运行原理之前,我们需要知道现代计算机多核CPU并发缓存架构:

 

那么问题来了!CPU缓存是什么东西?现代的CPU和主内存之间都会有CPU高速缓存来解决一个内存和CPU二者之间速度不匹配问题:主内存的速度跟不上CPU的高速运行

上图是计算机组成原理,大学肯定学过,现在的状态就是:看到了来一句“我kao,这玩意我知道啊!”,看不到的时候从来想不起来。。。

那么在Java线程内存模型中,其实和CPU缓存模型是一个意思,是基于CPU缓存模型来建立的:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值