volatile原理
volatile的底层实现原理是内存屏障,Memory Barrier(Memory Fence)
对volatile变量的写指令后会加入写屏障
对volatile变量的读指令之前会加入读屏障
1.如何保证可见性:
写屏障(sfence)保证在该屏障之前的,对共享变量的改动,都同步到主存当中,而不是使用缓存中的数据
public void actor(I_Result r) {
num = 2;
ready = ture; //ready 是volatile赋值带写屏障
//写屏障
}
读屏障(ifence)保证在该屏障之后,对共享变量的读取,加载的是主存中最新数据,而不是使用缓存中的数据
public void actor(I_Result r){
//读屏障
//ready 是volatile读取值带读屏障
if(ready) {
r,r1 = num + num;
}else{
r.r1 = 1;
}
}
2.如何保证有序性:
写屏障会确保指令重排序时,不会将写屏障之前的代码排在写屏障之后
读屏障会确保指令重排序时,不会将读屏障之后的代码排在读屏障之前