java volatile關(guān)鍵字在Java中有什么作用?
volatile關(guān)鍵字在Java中有什么作用?Volatile是為了防止指令重排序以確??梢?jiàn)性對(duì)于JVM級(jí)別,它是為了防止編譯器重排序同時(shí),對(duì)于某些CPU,它們會(huì)通過(guò)緩存鎖或線程來(lái)解決緩存可見(jiàn)性但是,
volatile關(guān)鍵字在Java中有什么作用?
Volatile是為了防止指令重排序以確保可見(jiàn)性
對(duì)于JVM級(jí)別,它是為了防止編譯器重排序
同時(shí),對(duì)于某些CPU,它們會(huì)通過(guò)緩存鎖或線程來(lái)解決緩存可見(jiàn)性
但是,目前很多CPU已經(jīng)過(guò)優(yōu)化,因?yàn)榫彺嬉恢滦訫ESI會(huì)帶來(lái)性能開(kāi)銷(xiāo),因此使用storebuffer機(jī)制來(lái)進(jìn)行異步處理,而這種機(jī)制會(huì)導(dǎo)致指令的無(wú)序執(zhí)行。這會(huì)導(dǎo)致可見(jiàn)性問(wèn)題。
然后volatile將在CPU級(jí)別增加內(nèi)存屏障,以解決由CPU無(wú)序執(zhí)行引起的可見(jiàn)性問(wèn)題
1。Volatile是線程同步的輕量級(jí)實(shí)現(xiàn),因此Volatile的性能優(yōu)于synchronize;Volatile只能用來(lái)修改變量,synchronize可以用來(lái)修改方法和代碼塊。隨著JDK技術(shù)的發(fā)展,同步在執(zhí)行效率上會(huì)有很大的提高,所以同步在項(xiàng)目的過(guò)程中還是比較普遍的。對(duì)volatile的多線程訪問(wèn)將不會(huì)阻塞;而同步將阻塞;
3。Volatile可以保證私有內(nèi)存和主內(nèi)存之間變量的同步,但不能保證變量的原子性;同步可以保證變量的原子性;
4。Volatile是多線程間變量的可見(jiàn)性;synchronize是多線程間訪問(wèn)資源的同步;對(duì)于Volatile修改的變量,可以解決讀取時(shí)變量的可見(jiàn)性問(wèn)題,但不能保證原子性。對(duì)于多線程訪問(wèn)同一實(shí)例變量,需要鎖同步。