背景
Java内存模型定义了8种原子操作:
- lock:锁住某个主存地址,为一个线程占用
- unlock:释放某个主存地址,允许其他线程访问该地址的数据
- read:将主存的值读取到工作内存
- Load:将read读取的值保存到工作内存的变量副本
- use:将值传递给线程的代码执行引擎
- assign:将执行引擎的处理返回的值重新赋值给变量副本
- Store:将变量副本的值刷新到主存
- write:将store存储的值写入到主内存的共享变量中
说明:
- 工作内存:可以理解成CPU的local memory,也就是CPU的寄存器
- 变量副本:可以理解成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种屏障的功效,但是我不理解= =有盆友知道的话,请不吝赐教~~~
其他
内存屏障影响的是同一个线程内的代码的执行顺序。