volatile原理

volatile的底层实现原理是内存屏障,Memory Barrier(Memory Fence)

  1. volatile变量的写指令后会加入写屏障
  2. volatile变量的读指令之前会加入读屏障

1.如何保证可见性:

写屏障(sfence)保证在该屏障之前的,对共享变量的改动,都同步到主存当中,而不是使用缓存中的数据

  1. public void actor(I_Result r) {
  2. num = 2;
  3. ready = ture; //ready 是volatile赋值带写屏障
  4. //写屏障
  5. }

读屏障(ifence)保证在该屏障之后,对共享变量的读取,加载的是主存中最新数据,而不是使用缓存中的数据

  1. public void actor(I_Result r){
  2. //读屏障
  3. //ready 是volatile读取值带读屏障
  4. if(ready) {
  5. r,r1 = num + num;
  6. }else{
  7. r.r1 = 1;
  8. }
  9. }

1646917373979.png


2.如何保证有序性:

写屏障会确保指令重排序时,不会将写屏障之前的代码排在写屏障之后

读屏障会确保指令重排序时,不会将读屏障之后的代码排在读屏障之前