1.什麼是指令重排序
編譯器和處理器爲了代碼的執行效率會對指令進行重新排序,我們稱之爲重排序。
public class Demo {
private int a;
private int b;
private int c;
public void a() {
a = 1; //1
b = 2; //2
c = a; //3
b = c + a; //4
System.out.println(b);
}
public static void main(String[] args) {
new Demo().a();
}
}
爲了提高代碼執行效率,步驟4可能會在步驟3之前執行,我們把這種現象成爲指令重排序。
2.重排序的前提條件
數據依賴性(as-if-serial),即在單線程環境下無論以什麼順序執行都保證結果正確,依賴包括,寫後讀,讀後寫,寫後寫。只有滿足這個條件才能進行指令重排序。
3.重排序的分類
編譯器重排序、處理器重排序。
4.爲什麼要進行指令重排序
爲了提高程序的運行性能。
5.指令重排序帶來的影響
指令重排序對於單線程只是單純地提高了代碼的執行效率,對於多線程來說,可能造成代碼執行結果錯誤。
6.競爭與同步
處於競爭狀態的代碼在進行同步後可以避免重排序在多線程環境下帶來的問題。