volatile底層實(shí)現(xiàn)原理 volatile關(guān)鍵字在Java中有什么作用?
volatile關(guān)鍵字在Java中有什么作用?volatile是防止指令重排序來(lái)保證可見(jiàn)性對(duì)于JVM層面是防止編譯器的重排序同時(shí),對(duì)于有些cpu來(lái)說(shuō),他們會(huì)通過(guò)緩存鎖或者中線索來(lái)解決緩存可見(jiàn)性但是,目
volatile關(guān)鍵字在Java中有什么作用?
volatile是防止指令重排序來(lái)保證可見(jiàn)性
對(duì)于JVM層面是防止編譯器的重排序
同時(shí),對(duì)于有些cpu來(lái)說(shuō),他們會(huì)通過(guò)緩存鎖或者中線索來(lái)解決緩存可見(jiàn)性
但是,目前很多cpu都做了優(yōu)化,因?yàn)榫彺嬉恢滦訫ESI會(huì)帶來(lái)性能開(kāi)銷,所以用到了storebuffer機(jī)制來(lái)做異步處理,而這種機(jī)制帶來(lái)了指令的亂序執(zhí)行。從而導(dǎo)致可見(jiàn)性問(wèn)題。
那么volatile會(huì)在cpu層面會(huì)增加內(nèi)存屏障,來(lái)解決cpu的亂序執(zhí)行帶來(lái)的可見(jiàn)性問(wèn)題
synchronize具有可見(jiàn)性嗎?
volatile是線程同步的輕量級(jí)實(shí)現(xiàn),所以volatile的性能要比synchronize好;volatile只能用于修飾變量,synchronize可以用于修飾方法、代碼塊。隨著jdk技術(shù)的發(fā)展,synchronize在執(zhí)行效率上會(huì)得到較大提升,所以synchronize在項(xiàng)目過(guò)程中還是較為常見(jiàn)的;
2.多線程訪問(wèn)volatile不會(huì)發(fā)生阻塞;而synchronize會(huì)發(fā)生阻塞;
3.volatile能保證變量在私有內(nèi)存和主內(nèi)存間的同步,但不能保證變量的原子性;synchronize可以保證變量原子性;
4.volatile是變量在多線程之間的可見(jiàn)性;synchronize是多線程之間訪問(wèn)資源的同步性;
對(duì)于volatile修飾的變量,可以解決變量讀時(shí)可見(jiàn)性問(wèn)題,無(wú)法保證原子性。對(duì)于多線程訪問(wèn)同一個(gè)實(shí)例變量還是需要加鎖同步。