cup亂序執行
(1)、介紹:cpu在進行讀等待的同時執行指令,cpu亂序的根源,不是亂,而是提升效率,如上圖,若是指令1和指令2沒有依賴關係,指令2會優先執行,由於從內存獲取指令1須要等待
(2)、致使的問題:DCL單例爲何要加volatile(volatile能夠禁止指令重排),由於對象初始化有個中間態,這個時候若是發生指令重排,會有問題,以下圖:
(3)、如何禁止指令重排segmentfault
(3-1)、CPU層面:內存屏障:一、sfence:在sfence指令前的寫操做當必須在sfence指令後的寫操做前完成。二、Ifence:在Ifence指令前的讀操做當必須在Ifence指令後的讀操做前完成。三、mfence:在mfence指令前的讀寫操做當必須在mfence指令後的讀寫操做前完成 鎖總線:intel lock彙編指令:原子指令,如x86上的「lock...」指令是一個Full Barrier,執行時會鎖住內存子系統來確保執行順序(其實是鎖內存總線),甚至跨多個CPU,Software Locks一般使用了內存屏障或原子指令來實現變量的可見性和保存程序順序 (3-2)、jvm層面(8個hanppens-before原則 4個內存屏障(LL LS SL SS)): JSR內存屏障(cpu的lock指令):對於cpu的原語(sfence、Ifence、mfence)不是每一個cpu都有,而lock指令是大部分cpu都有的,因此jvm採用了偷懶的方式
NUMA(Non Uniform Memory Access)非統一訪問內存,在主板上有不一樣的插槽,每一個cpu都有一塊離本身最近的內存,本身的訪問優先級最高(也能夠訪問別人家的內存,只是效率稍低一些),以下圖:
4.拓展:as if serial 無論如何重排序,單線程執行結果不會變,看起來像正常的順序執行同樣,好比a=1;y=b;這兩條絕不相關的指令,是能夠進行重排序的緩存
上一篇:https://segmentfault.com/a/11...
下一篇:https://segmentfault.com/a/11...jvm