as-if-serial語義的意思指:程序員
無論怎麼重排序(編譯器和處理器爲了提升並行度),(單線程)程序的執行結果不能被改變。編譯器,runtime 和處理器都必須遵照as-if-serial語義。爲了遵照as-if-serial語義,編譯器和處理器不會對存在數據依賴關係的操做作重排序,由於這種重排序會改變執行結果。可是,若是操做之間不存在數據依賴關係,spa
這些操做可能被編譯器和處理器重排序。爲了具體說明,請看下面計算圓面積的代碼示例:線程
double pi = 3.14; //Ablog
double r = 1.0; //B排序
double area = pi * r * r; //C內存
上面三個操做的數據依賴關係以下圖所示:編譯器
如上圖所示,A和C之間存在數據依賴關係,同時B和C之間也存在數據依賴關係。所以在最終執行的指令序列中,C不能被重排序到A和B的前面(C排到 A和B的前面,程序的結果將會被改變)。it
但A和B之間沒有數據依賴關係,編譯器和處理器能夠重排序A和B之間的執行順序。下圖是該程序的兩種執行順序:編譯
as-if-serial語義把單線程程序保護了起來,遵照as-if-serial語義的編譯器,runtime 和處理器共同爲編寫單線程程序的程序員建立了一個幻覺:單線程程序是按程序的順序來執行的。as-if-serial語義使單線程程序員無需擔憂重排序會 干擾他們,也無需擔憂內存可見性問題。class