JVM 之volatile關(guān)鍵字重排序

計算機在執(zhí)行程序時。為了提供性能,編譯器和處理器的常常會對指令做重排,
源代碼--->編譯器優(yōu)化的重排--->指令并行的重排--->內(nèi)存系統(tǒng)的重排--->最終執(zhí)行的指令

一般分以下3種

1.單線程里面確保程序最終執(zhí)行結(jié)果和代碼順訊執(zhí)行的結(jié)果一致。

2.處理器在進(jìn)行重排序是必須要考慮指令之間的數(shù)據(jù)依賴性

3.多線程環(huán)境中線程交替執(zhí)行,由于編譯器優(yōu)化重排的存在,兩個想成中使用的變量能否保證一致性是無法確定的,結(jié)果無法預(yù)測。

volatile實現(xiàn)禁止指令重排優(yōu)化,從而避免多線程環(huán)境下程序出現(xiàn)亂序執(zhí)行的現(xiàn)象,

先了解一個概念,內(nèi)存屏障(Memory Barrier) 又稱內(nèi)存柵欄,是一個CPU指令,它的作用有兩個;

一是保證特定操作的順序執(zhí)行,

二是保證某些變量的內(nèi)存可見性(利用該特性實現(xiàn)volatile的內(nèi)存可見性)。

由于編譯器和處理器都執(zhí)行指令重排優(yōu)化,如果指令間插入一條Memory Barrier則會告訴編譯器和CPU,不管什么指令都不能用強制刷出各種CPU的緩存數(shù)據(jù),因此任何CPU上的線程都能讀取到這些數(shù)據(jù)的最新版。

DCL(雙端檢鎖)機制不一定線程安全,原因是指令重排序的存在,加入volatile可以禁止指令重排

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

推薦閱讀更多精彩內(nèi)容