JMM(Java Memory Model)是一種規(guī)范,定義了在多線程環(huán)境下Java程序中的內(nèi)存訪問行為。JMM保證了在多線程環(huán)境下程序的正確性,同時也允許編譯器和處理器對指令進行優(yōu)化,以提高程序的性能。
Java線程之間的通信由Java內(nèi)存模型(簡稱JMM)控制,從抽象的?度來說,JMM定義了線程和主內(nèi)存之間的抽象關(guān)系。JMM的抽象示意圖如圖所示:
?對于每?個線程來說,棧都是私有的,?堆是共有的。也就是說在棧中的變量(局部變量、?法定義參數(shù)、異常處理器參數(shù))不會在線程之間共享,也就不會有內(nèi)存可?性的問題,也不受內(nèi)存模型的影響。?在堆中的變量是共享的,稱為共享變量。
所以,內(nèi)存可?性是針對的共享變量
既然堆是共享的,為什么在堆中會有內(nèi)存不可?問題?
這是因為現(xiàn)代計算機為了?效,往往會在?速緩存區(qū)中緩存共享變量,因為cpu訪問緩存區(qū)?訪問內(nèi)存要快得多。
線程之間的共享變量存在主內(nèi)存中,每個線程都有?個私有的本地內(nèi)存,存儲了該線程以讀、寫共享變量的副本。本地內(nèi)存是Java內(nèi)存模型的?個抽象概念,并不真實存在。它涵蓋了緩存、寫緩沖區(qū)、寄存器等。
Java線程之間的通信由Java內(nèi)存模型(簡稱JMM)控制,從抽象的?度來說,JMM定義了線程和主內(nèi)存之間的抽象關(guān)系。JMM的抽象示意圖如圖所示:
?從圖中可以看出:
1. 所有的共享變量都存在主內(nèi)存中。
2. 每個線程都保存了?份該線程使?到的共享變量的副本。
3. 如果線程A與線程B之間要通信的話,必須經(jīng)歷下?2個步驟:
i. 線程A將本地內(nèi)存A中更新過的共享變量刷新到主內(nèi)存中去。
ii. 線程B到主內(nèi)存中去讀取線程A之前已經(jīng)更新過的共享變量。
所以,線程A?法直接訪問線程B的?作內(nèi)存,線程間通信必須經(jīng)過主內(nèi)存。
注意,根據(jù)JMM的規(guī)定,線程對共享變量的所有操作都必須在??的本地內(nèi)存中進?,不能直接從主內(nèi)存中讀取。
那么怎么知道這個共享變量的被其他線程更新了呢?這就是JMM的功勞了,也是JMM存在的必要性之?。JMM通過控制主內(nèi)存與每個線程的本地內(nèi)存之間的交互,來提供內(nèi)存可?性保證。
Java中的volatile關(guān)鍵字可以保證多線程操作共享變量的可?性以及禁?指令重排序,synchronized關(guān)鍵字不僅保證可?性,同時也保證了原?性(互斥性)。在更底層,JMM通過內(nèi)存屏障來實現(xiàn)內(nèi)存的可?性以及禁?重排序。為了程序員的?便理解,提出了happens-before,它更加的簡單易懂,從?避免了程序員為了理解內(nèi)存可?性?去學習復雜的重排序規(guī)則以及這些規(guī)則的具體實現(xiàn)?法。
happens-before?談?wù)?JMM的happens-before_眾樂樂_2016的博客-CSDN博客??
JMM與Java內(nèi)存區(qū)域劃分的區(qū)別與聯(lián)系
上?兩?節(jié)分別提到了JMM和Java運?時內(nèi)存區(qū)域的劃分,這兩者既有差別?有聯(lián)系:
區(qū)別:兩者是不同的概念層次。JMM是抽象的,他是?來描述?組規(guī)則,通過這個規(guī)則來控制各個變量的訪問?式,圍繞原?性、有序性、可?性等展開的。?Java運?時內(nèi)存的劃分是具體的,是JVM運?Java程序時,必要的內(nèi)存劃分。
聯(lián)系:都存在私有數(shù)據(jù)區(qū)域和共享數(shù)據(jù)區(qū)域。?般來說,JMM中的主內(nèi)存屬于共享數(shù)據(jù)區(qū)域,他是包含了堆和?法區(qū);同樣,JMM中的本地內(nèi)存屬于私有數(shù)據(jù)區(qū)域,包含了程序計數(shù)器、本地?法棧、虛擬機棧。文章來源:http://www.zghlxwxcb.cn/news/detail-419542.html
實際上,他們表達的是同?種含義文章來源地址http://www.zghlxwxcb.cn/news/detail-419542.html
到了這里,關(guān)于為什么會有JMM?從0到1一次性說清楚的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!