CPU指令重排序

2021-10-20 10:29:49 字數 1351 閱讀 4072

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;

第二種 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;

而這六種執行順序最後x、y的結果值為:

第一種 0 1

第二種 1 0

第三種 1 1

第四種 1 1

第五種 1 1

第六種 1 1

可以發現上面的執行順序不可能出現x、y同時為0的情況,除非發生指令重排序導致下面這種執行順序:

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...