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