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