背景
Java內(nèi)存模型定義了8種原子操作:
- lock:鎖住某個(gè)主存地址鸳谜,為一個(gè)線程占用
- unlock:釋放某個(gè)主存地址,允許其他線程訪問該地址的數(shù)據(jù)
- read:將主存的值讀取到工作內(nèi)存
- Load:將read讀取的值保存到工作內(nèi)存的變量副本
- use:將值傳遞給線程的代碼執(zhí)行引擎
- assign:將執(zhí)行引擎的處理返回的值重新賦值給變量副本
- Store:將變量副本的值刷新到主存
- write:將store存儲(chǔ)的值寫入到主內(nèi)存的共享變量中
說明:
- 工作內(nèi)存:可以理解成CPU的local memory式廷,也就是CPU的寄存器
- 變量副本:可以理解成JVM stack(JVM 寄存器)
所以= = store和write的區(qū)別是什么= =
指令
LoadLoad 屏障
Load1/LoadLoad/Load2咐扭,保證從主存讀取變量1的操作在從主存讀取變量2及其后續(xù)的變量之前完成,不會(huì)發(fā)生變量2及其后續(xù)的變量的讀取語句被重排序到變量1語句之前滑废,那LoadLoad屏障之后的寫操作會(huì)被重排序到變量1的讀取之前嗎蝗肪?LoadStore屏障
Load1/LoadStore/Store2,變量2及其后續(xù)的變量的值從工作內(nèi)存被刷新到主存之前蠕趁,保證從主存中將變量1的值先拷貝到工作內(nèi)存中薛闪。StoreStore屏障
Store1/StoreStore/Store2,變量2及其后續(xù)變量的值被刷新到主存之前俺陋,保證變量1的值被刷新到主存中逛绵。StoreLoad屏障:
Store1/StoreLoad/Load2,從主存拷貝變量2及其后續(xù)變量的值到工作內(nèi)存之前倔韭,保證變量1的值被刷新到主存中术浪。
很多資料都說,該屏障是最強(qiáng)屏障寿酌,具有前面3種屏障的功效胰苏,但是我不理解= =有盆友知道的話,請(qǐng)不吝賜教~~~
其他
內(nèi)存屏障影響的是同一個(gè)線程內(nèi)的代碼的執(zhí)行順序醇疼。