volaite的作用:1保证变量对所有线程可见;2.禁止指令重排序
可见性是指:读取时都从主内存读取;修改后立即写入主内存,使其他工作内存数据失效;
重排序:内存屏障会为指令的执行提供以下保障
1.不会把后边的代码排到内存屏障之前;
2.不会把前门的代码排到内存屏障之后;
3.在执行到内存屏障修饰的指令时前面的代码全部执行完成;
4.强制将工作内存值的修改刷新至主内存;
5.如果是写操作,会导致其他线程工作内存中的缓冲失效。
volatile实现原理
1)在volatile写操作的前面插入一个StoreStore屏障,保证volatile写操作不会和之前的写操作重排序。
2)在volatile写操作后边插入一个SroreLoad屏障,保证volatile写操作不会和之后的读操作重排序。
3)在volatile读操作的后边增加一个loadLoad屏障+LoadStore屏障。保证volatile读操作不会和之后的读操作,写操作重排序。