JAVA記憶體模型,重排序的概念

2021-07-10 20:45:40 字數 787 閱讀 9593

static int a, b = 0;

static int x, y = 0;

public static void main(string args) throws interruptedexception

});thread two = new thread(new runnable() });

one.start();

two.start();

one.join();

two.join();

system.out.println("(x,y,a,b) = " + "(" + x + "," + y + ")" + "(" + a + "," + b + ")");

if(x == 0  && y == 0 && a==1 && b ==1)

}今天看到了上方的這一段程式, 執行後可能出現 0,0,1,1的情況。

究其原因,是編譯器和處理器可能會對操作做重排序。

所以編譯器和處理器可能對兩個run方法都進行重排序,導致輸出0,0,1,1。

注:

只有多執行緒情況下拆分有依賴關係的操作,才會出現重排序問題。

比如在單執行緒中,執行  b = 1;a = 1;x = a; y = b;  是不會有問題的。因為x=a依賴於a=1這個操作,所以不會重排序。

而在多執行緒中,tow執行緒run方法中y = b; 不知道它依賴與one執行緒run方法中b = 1;所以會重排序

java記憶體模型之重排序

編譯器和處理器為了優化程式效能而對指令序列進行重新排序 資料依賴性 如果兩個操作訪問同乙個變數,且這兩個操作中有乙個為寫操作,此時這兩個操作之間就存在資料依賴性。資料依賴型別有 1 寫 a 1 後讀 b a 2 寫 a 1 後寫 a 2 3 讀 a b 後寫 b 1 這些依賴操作如果更改順序則會造成...

Java 記憶體模型的基礎(二) 重排序

如果兩個操作訪問同乙個變數,且兩個操作中有乙個為寫操作,此時這兩個操作就存在資料依賴性。資料依賴分為以下三種情況 名稱 示例 說 明 寫後讀a 1 b 2 寫乙個變數後,再讀這個位置 寫後寫a 1 a 2 寫乙個變數後,再寫這個變數 讀後寫a b b 1 讀乙個變數之後,再寫這個變數 上述三種情況,...

深入理解Java記憶體模型(二) 重排序

如果兩個操作訪問同乙個變數,且這兩個操作中有乙個為寫操作,此時這兩個操作之間就存在資料依賴性。資料依賴分下列三種型別 上面三種情況,只要重排序兩個操作的執行順序,程式的執行結果將會被改變。前面提到過,編譯器和處理器可能會對操作做重排序。編譯器和處理器在重排序時,會遵守資料依賴性,編譯器和處理器不會改...