1. 程式人生 > 其它 >jvm-指令重排

jvm-指令重排

定義:

大多數現代微處理器都會採用將指令亂序執行(out-of-order execution,簡稱OoOE或OOE)的方法,在條件允許的情況下,直接運行當前有能力立即執行的後續指令,避開獲取下一條指令所需資料時造成的等待3。通過亂序執行的技術,處理器可以大大提高執行效率。而這就是指令重排。

這種場景我們可以通過模擬多執行緒的方式測試出來,測試程式碼如下:

public class TestMemory {
    static int x = 0, y = 0;
    static int a = 0, b = 0;

    public static void main(String[] args) throws
InterruptedException { Map<String, Integer> count = new HashMap<>(); for (int i = 0; i < 10000; i++) { String str = test(); if (count.containsKey(str)) { Integer c = count.get(str); count.put(str, ++c); }
else { count.put(str, 1); } } System.out.println(count); } public static String test() throws InterruptedException { Thread one = new Thread(new Runnable() { @Override public void run() { a = 1; x
= b; } }); Thread other = new Thread(new Runnable() { @Override public void run() { b = 1; y = a; } }); // 下面啟動兩個執行緒,通過結果可以看出來結果是不確定的,原因就是處理器執行的時候不是嚴格按照兩個執行緒的啟動順序執行的 one.start(); other.start(); return "(" + x + "," + y + ")"; } }

多次執行後,其中的一種結果如下:

{(1,1)=9964, (1,0)=1, (0,0)=35}

其中結果是不確定的,對於這種不確定性,如果業務中對結果關注的話,那需要自己處理;