cup乱序执行-》重排序-》可见性问题
使用内存屏障解决
cup层面内存屏障 :store barrier、 load barrier 、full barrier
一:JMM内存模型 ->语言级别抽象的内存模型{
volatile(语言级别的内存屏障实现可见性———执行时加了一个lock指令)、
syschronized(同步锁实现可见性)、
final(防止重排序实现可见性-final只能在构造方法里修改,而在构造方法中不能重排序)、
happens-before
}
原代码-编译重排序-cup重排序-执行最终指令
产生可见性问题根本原因:高速缓存、重排序(CUP指令优化)
JMM最核心价值:解决了有序性、可见性
小结:
编译器级别(语言级别的内存屏障)/cpu级别(Cup级别的内存屏障)
Cup级别的内存屏障:读、写、全
语言级别的内存屏障:loadload loadStore storeLoad storeStore
通过语言屏障控制有序性和可见性
二:happens-before原则
可见性保障 -> volatile外的方法
happens-before
会建立happens-before原则的八大规则
1.单线程中程序顺序运行规则
2.volatile规则,增加语言级别内存屏障
3.传递性规则
4.start规则
5.join规则
6.监视器锁规则(前一个锁释放后,后一个锁才能开始使用
7.8