Tips:最近面试,但凡是个像样的公司面试官都得问我对volatile关键字理解以及其实现原理。虽然多多少少知道一些,但是问深了,终究感觉还是差了那么一点,所以这次我要把这个关键字来学个通透!
本文记录个人学习volatile。主要包含以下内容,力求简单明了:
- 一段代码来演示问题背景
- volatile解决内存可见性问题
- Java内存模型原子操作
- 总线加锁太慢?MESI缓存一致性协议(总线嗅探机制)
- 彻底掌握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缓存模型来建立的: