cpu的速度至少比記憶體快100倍,為了提公升效率,會打亂原來的執行效率,會在一條指令執行過程中(比如去記憶體讀資料,大概慢100多倍),去同時執行另一條指令(前提是兩條指令沒有依賴關係)。體現在**層面
就是,寫在後面的**可能比前面的**先執行。
觀察下面**:
/**
* 測試指令重排序
*/public
class
reordertest);
thread other =
newthread((
)->);
one.
start()
; other.
start()
; one.
join()
; other.
join()
; string result =
"第"+ i +
"次 ("
+ x +
","+ y +
")";
if(x ==
0&& y ==0)}}}
如果沒有指令重排序,那麼對於執行緒one來說a = 1;一定在x = b;之前執行,對於執行緒other也是如此。
當兩個執行緒同時執行時,**的執行順序只能是以下幾種:
第一種 a = 1; x = b; b = 1; y = a;而這六種執行順序最後x、y的結果值為:第二種 b = 1; y = a; a = 1; x = b;
第三種 a = 1; b = 1; x = b; y = a;
第四種 a = 1; b = 1; y = a; x = b;
第五種 b = 1; a = 1; y = a; x = b;
第六種 b = 1; a = 1; x = b; y = a;
第一種 0 1可以發現上面的執行順序不可能出現x、y同時為0的情況,除非發生指令重排序導致下面這種執行順序:第二種 1 0
第三種 1 1
第四種 1 1
第五種 1 1
第六種 1 1
x = b; y = a; a = 1; b = 1;實測可以發現執行到第20422次時發生了指令重排序(執行次數可能會不一樣)
說明cpu確實發生了指令重排序
cpu指令重排序的原理
目錄 1.重排序場景 2.追根溯源 3.快取一致性協議 4.重排序原因 一 重排序場景 class resortdemo public void reader 當兩個執行緒 a 和 b,a 首先執行writer 方法,隨後 b 執行緒接著執行 reader 方法。執行緒b在執行操作4時,能否看到執行...
從JVM併發看CPU記憶體指令重排序
這兩天,我拜讀了 dennis byrne 寫的一片博文memory barriers and jvm concurrency 中譯文記憶體屏障與jvm併發 文中提到 對主存的一次訪問一般花費硬體的數百次時鐘週期。處理器通過快取 caching 能夠從數量級上降低記憶體延遲的成本這些快取為了效能重新...
指令重排序 as if serial
筆者認為看完一本書或剛要了解完乙個知識點 最好自己先執行一些demo 自己嘗試著去了解下各種意思 這樣知識點最終一定是你的。靠死記硬背的討論或簡單的粗暴的看下資料 腦子裡肯定還是一團漿糊。從上述的列印結果你看懂了什麼。總結如下 1 上述中下行有兩行before內容,並沒有中規中矩的先before再e...