volatile:可以解决可见性与有序性问题
CPU层面的内存屏障:
1.Store Barrier:强制所有在store屏障指令之前的stroe指令,都在该stroe指
令执行之前都执行完毕,并把store缓存的数据全部写回到内存
2.Load Barrier:强制所有在Load屏障指令之后的load指令,都在该Load屏
障指令之后
被执行,并且一直等到load缓存区被cpu读取完毕才执行之后的load指令
3.Full Barrier:集成了Stroe Barrier和Load Barrier屏障的功能
JVM根据这些屏障在JVM层面做了相应的处理禁用重排序与禁用缓存来解决可见性
与有序性的问题
JMM层面对应了四种屏障:
1.loadload: loadA loadload loadB :loadA必须在LoadB之前被读取到cpu
2.stroestroe
3.loadstroe
4.stroeload
1.加了volatile,从本质上来看是通过内存屏障来禁用重排序而解决有序性问题,
以及通过禁用高速缓存来解决可见性问题,其中禁用高速缓存是通过lock指令
其中的写屏障对应着Stroe,禁用了重排序,,并且将值立刻写回了内存,读屏障保证在
执行assert value==10,缓存区的值能够被读取到cpu,从而使这个断言成立