1、volatile
保证线程间可见性
2、如何保证可见性
hsdis
可以看到汇编指令多了一个lock(加缓存锁)->内存屏障
CPU高速缓存(L1/L2/L3),会带来缓存不一致问题
CPU层面解决方案
1、总线锁
2、缓存锁
MESI协议
M:Modified修改状态
E:Exclusive独享状态
S:Shared共享状态
I:Invalid失效状态
cpu的乱序执行->重排序->可见性问题
cpu层面提供指令->内存屏障->可以解决可见性问题
cpu层面提供了3种屏障
写屏障(store barrier):
读屏障(load barrier):
全屏障(full barrier):
JMM内存模型
可见性问题的根本原因:CPU高速缓存和重排序
重排序
原代码->编译器重排序->cpu层面重排序(指令级、内存)->最终执行的指令
不是所有的程序都会进行重排序
数据依赖规则
as-if-serial:不管怎么重排序,对于单个线程的执行结果不变
内存屏障
编译器级别(语言级别的内存屏障)
loadload
storestore
loadstore
storeload
cpu级别
哪些操作会建立happens-before原则
1、程序的顺序规则
2、volatile规则
3、传递性规则
4、start规则
5、join规则
6、synchronized