as-if-serial語義的意思是:不管怎么進行指令重排序,單線程內程序的執行結果不能被改變。編譯器,處理器進行指令重排序都必須要遵守as-if-serial語義規則。
為了遵守as-if-serial語義,編譯器和處理器對存在依賴關系的操作,都不會對其進行重排序,因為這樣的重排序很可能會改變執行的結果,但是對不存在依賴關系的操作,就有可能進行重排序。
happens-before規則
雖然As-If-Serial語義可以保證單線程內指令重排序的正確性,但對於多線程還是可能出現問題,多線程環境下存在可見性的問題。
可見性是指當一個線程修改了共享變量的值,其它線程能夠適時得知這個修改。在單線程環境中,如果在程序前面修改了某個變量的值,后面的程序一定會讀取到那個變量的新值。這看起來很自然,然而當變量的寫操作和讀操作在不同的線程中時,情況卻並非如此。