計算機在執(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可以禁止指令重排