內(nèi)容目錄:


volatile在Java內(nèi)存模型(JMM)中,保證共享變量對所有線程可見,但不保證原子性。volatile語義是同步,通過共享變量的方式,完成線程間的通信。

為什么需要volatile

Java內(nèi)存模型中抽象、簡化了計(jì)算機(jī)物理設(shè)備,分成工作內(nèi)存和主內(nèi)存,線程有各自的工作內(nèi)存,卻共享主內(nèi)存。如果要把Java內(nèi)存模型與物理設(shè)備映射起來的話,L1,L2 Cache可以視為工作內(nèi)存,而L3 Cache視為主內(nèi)存。線程執(zhí)行指令時(shí),會優(yōu)先選擇距離 CPU 較近的位置的工作內(nèi)存中使用,而不會從讀寫速度較慢的主內(nèi)存中,我稱之為“就近原則”。當(dāng)線程指令執(zhí)行完后,賦值給工作內(nèi)存,如果不回寫到主內(nèi)存,或者通知其他線程,其他線程是無法知曉變量已經(jīng)修改,仍然會使用曾經(jīng)緩存在工作內(nèi)存中的變量,這就造成了緩存不一致的問題,Java使用volatile解決這種問題。volatile保證指令賦值完后的變量立即同步回主內(nèi)存中,聲明并通知其他線程當(dāng)前賦值的變量已經(jīng)失效,其他線程在下次使用時(shí)會放棄工作內(nèi)存中變量,使用主內(nèi)存中的變量。這樣就完成了線程間對于volatile修飾的變量的通信。

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式