Java内存屏障

背景

Java内存模型定义了8种原子操作:

  1. lock:锁住某个主存地址,为一个线程占用
  2. unlock:释放某个主存地址,允许其他线程访问该地址的数据
  3. read:将主存的值读取到工作内存
  4. Load:将read读取的值保存到工作内存的变量副本
  5. use:将值传递给线程的代码执行引擎
  6. assign:将执行引擎的处理返回的值重新赋值给变量副本
  7. Store:将变量副本的值刷新到主存
  8. write:将store存储的值写入到主内存的共享变量中

说明:

  1. 工作内存:可以理解成CPU的local memory,也就是CPU的寄存器
  2. 变量副本:可以理解成JVM stack(JVM 寄存器)
    所以= = store和write的区别是什么= =

指令

  • LoadLoad 屏障
    Load1/LoadLoad/Load2,保证从主存读取变量1的操作在从主存读取变量2及其后续的变量之前完成,不会发生变量2及其后续的变量的读取语句被重排序到变量1语句之前,那LoadLoad屏障之后的写操作会被重排序到变量1的读取之前吗?

  • LoadStore屏障
    Load1/LoadStore/Store2,变量2及其后续的变量的值从工作内存被刷新到主存之前,保证从主存中将变量1的值先拷贝到工作内存中。

  • StoreStore屏障
    Store1/StoreStore/Store2,变量2及其后续变量的值被刷新到主存之前,保证变量1的值被刷新到主存中。

  • StoreLoad屏障:
    Store1/StoreLoad/Load2,从主存拷贝变量2及其后续变量的值到工作内存之前,保证变量1的值被刷新到主存中。
    很多资料都说,该屏障是最强屏障,具有前面3种屏障的功效,但是我不理解= =有盆友知道的话,请不吝赐教~~~

其他

内存屏障影响的是同一个线程内的代码的执行顺序。

你可能感兴趣的:(Java内存屏障)