⭐️編譯器和處理器為了優化程式效能而對指令序列進行重新排序
?資料依賴性
如果兩個操作訪問同乙個變數,且這兩個操作中有乙個為寫操作,此時這兩個操作之間就存在資料依賴性。
資料依賴型別有:1️⃣寫(a=1)後讀(b=a) 2️⃣寫(a=1)後寫(a=2)3️⃣讀(a=b)後寫(b=1)
這些依賴操作如果更改順序則會造成程式結果錯誤。所以具有依賴關係的不可重排序。
?as-if-serial語義
不管怎麼重排序,單執行緒的執行結果不能改變。也就是不能重排序具有依賴關係的操作。
?重排序對多執行緒的影響
這個還是看書吧,沒什麼好總結的
提取出來的一點是
if(flag)
操作一和操作二之間存在控制依賴性
這個時候,編譯器和處理器會採用猜測執行來克服相關性對並行度的影響
即先開闢乙個變數儲存a*a 命名為temp
當flag判斷為真後,直接將temp複製給i
JAVA記憶體模型,重排序的概念
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.sta...
Java 記憶體模型的基礎(二) 重排序
如果兩個操作訪問同乙個變數,且兩個操作中有乙個為寫操作,此時這兩個操作就存在資料依賴性。資料依賴分為以下三種情況 名稱 示例 說 明 寫後讀a 1 b 2 寫乙個變數後,再讀這個位置 寫後寫a 1 a 2 寫乙個變數後,再寫這個變數 讀後寫a b b 1 讀乙個變數之後,再寫這個變數 上述三種情況,...
深入理解Java記憶體模型(二) 重排序
如果兩個操作訪問同乙個變數,且這兩個操作中有乙個為寫操作,此時這兩個操作之間就存在資料依賴性。資料依賴分下列三種型別 上面三種情況,只要重排序兩個操作的執行順序,程式的執行結果將會被改變。前面提到過,編譯器和處理器可能會對操作做重排序。編譯器和處理器在重排序時,會遵守資料依賴性,編譯器和處理器不會改...