CPU内存屏障
sfence:StoreFence,当前写操作,与之前的写操作不允许重排序
lfence:LoadFence,当前读操作,与之前的读操作不允许重排序
mfence:MixedFence,当前操作,与之前的操作不允许重排序
JSR内存屏障
lock指令
原子指令,lock指令是一个full barrier,执行时会锁住内存子系统来确保执行顺序,可以跨多个cpu。优先使用缓存一致性协议,其他使用锁总线,缓存一致性协议失效情况:1cpu不支持,2变量超过缓存行大小64bytes
volatile内存语义:
java:volatile
字节码:ACC_VOLATILE
jvm层:storestore volatilewrite storeload、volatileread loadload loadstore
os:lock指令,优先缓存一致性协议,其他锁总线
synchronized内存语义:
java:synchronized
字节码:monitorenter monitorexit acc_synchronized
jvm层面:mutex保证只有一个线程能进入,monitorenter load acquire #code releasebarrier monitorexit storebarrier
os:lock总线,cmpxchg
as if serial
不管如何重排序,单线程执行结果不变。
happens-before原则
程序次序规则:一个线程内,一段代码直接结果是有序的
管程锁定所则:lock先与unlock
volatile变量规则:volatile读写不能重排序
线程启动规则:线程start先于这个线程的每一个操作
线程终止规则:线程的所有操作都先于线程的终止检测,线程结束的时候,所有变量都会刷新到主存
线程中断规则:
传递规则:
对象终止规则:对象初始化先与对象的finalize方法
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。