JVM之指令重排

1、什么是指令重排?

計(jì)算機(jī)執(zhí)行指令的過(guò)程中會(huì)經(jīng)過(guò)程序編譯器編譯形成的指令序列,一般而言,這個(gè)指令序列是會(huì)輸出確定的結(jié)果;以確保每一次的執(zhí)行都有確定的結(jié)果。但是,一般情況下,CPU和編譯器為了提升程序執(zhí)行的效率,會(huì)按照一定的規(guī)則允許進(jìn)行指令優(yōu)化,在某些情況下,這種優(yōu)化會(huì)帶來(lái)一些執(zhí)行的邏輯問(wèn)題,主要的原因是代碼邏輯之間是存在一定的先后順序,在并發(fā)執(zhí)行情況下,會(huì)發(fā)生二義性,即按照不同的執(zhí)行邏輯,會(huì)得到不同的結(jié)果信息。

2.? 數(shù)據(jù)依賴性

主要指不同的程序指令之間的順序是不允許進(jìn)行交換的,即可稱這些程序指令之間存在數(shù)據(jù)依賴性。

進(jìn)過(guò)分析,發(fā)現(xiàn)這里每組指令中都有寫(xiě)操作,這個(gè)寫(xiě)操作的位置是不允許變化的,否則將帶來(lái)不一樣的執(zhí)行結(jié)果。

編譯器將不會(huì)對(duì)存在數(shù)據(jù)依賴性的程序指令進(jìn)行重排,這里的依賴性僅僅指單線程情況下的數(shù)據(jù)依賴性;多線程并發(fā)情況下,此規(guī)則將失效。

3、as-if-serial語(yǔ)義

不管怎么重排序(編譯器和處理器為了提高并行度),(單線程)程序的執(zhí)行結(jié)果不能被改變。編譯器,runtime?和處理器都必須遵守as-if-serial語(yǔ)義。為了遵守as-if-serial語(yǔ)義,編譯器和處理器不會(huì)對(duì)存在數(shù)據(jù)依賴關(guān)系的操作做重排序,因?yàn)檫@種重排序會(huì)改變執(zhí)行結(jié)果。但是,如果操作之間不存在數(shù)據(jù)依賴關(guān)系,這些操作可能被編譯器和處理器重排序。

分析:? 關(guān)鍵詞是單線程情況下,必須遵守;其余的不遵守。


4.? 在多線程下的指令重排

多線程情況下,下面代碼指令重排是否會(huì)產(chǎn)生不同的結(jié)果?

上述的代碼,在單線程情況下,執(zhí)行結(jié)果是確定的, flag=true將被reader的方法體中看到,并正確的設(shè)置結(jié)果。 但是在多線程情況下,是否還是只有一個(gè)確定的結(jié)果呢?

在不同的線程之間共享變量;由于執(zhí)行順序、CPU編譯器對(duì)于程序指令的優(yōu)化等造成了不確定的執(zhí)行結(jié)果。

5、指令重排的原因

主要還是編譯器以及CPU為了優(yōu)化代碼或者執(zhí)行的效率而執(zhí)行的優(yōu)化操作;應(yīng)用條件是單線程場(chǎng)景下,對(duì)于并發(fā)多線程場(chǎng)景下,指令重排會(huì)產(chǎn)生不確定的執(zhí)行效果。

6、如何防止指令重排

volatile關(guān)鍵字可以保證變量的可見(jiàn)性,因?yàn)閷?duì)volatile的操作都在Main Memory中,而Main Memory是被線程所共享的,這里的代價(jià)就是犧牲了性能。

volatile還有一個(gè)作用就是局部阻止重排序的發(fā)生,對(duì)volatile變量的操作指令都不會(huì)被重排序,因?yàn)槿绻嘏判颍挚赡墚a(chǎn)生可見(jiàn)性問(wèn)題。

在保證可見(jiàn)性方面,鎖(包括顯式鎖、對(duì)象鎖)以及對(duì)原子變量的讀寫(xiě)都可以確保變量的可見(jiàn)性。但是實(shí)現(xiàn)方式略有不同,例如同步鎖保證得到鎖時(shí)從內(nèi)存里重新讀入數(shù)據(jù)刷新緩存,釋放鎖時(shí)將數(shù)據(jù)寫(xiě)回內(nèi)存以保數(shù)據(jù)可見(jiàn),而volatile變量干脆都是讀寫(xiě)內(nèi)存。

7、可見(jiàn)性

? 這里提到的可見(jiàn)性是指前一條程序指令的執(zhí)行結(jié)果,可以被后一條指令讀到或者看到,稱之為可見(jiàn)性。反之為不可見(jiàn)性。這里主要描述的是在多線程環(huán)境下,指令語(yǔ)句之間對(duì)于結(jié)果信息的讀取即時(shí)性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。