JMM(Java Memory Model)

什麼是JMM

JMM:Java Memory Model(Java內存模型),定義了Java 虛擬機(JVM)在計算機內存(RAM)中的工作方式,圍繞着在併發過程中如何處理可見性、原子性、有序性這三個特性而建立的模型。

Java內存模型——JMM

採用的是共享內存的方式。線程之間通過寫-讀內存中的公共狀態來隱式進行通信

可見性

JMM提供了volatile變量定義、final、synchronized塊來保證可見性。
例如:線程a在將共享變量x=1寫入主內存的時候,如何保證線程b讀取共享變量x的值爲1,這就是JMM做的事情。JMM通過控制主內存與每個線程的本地內存之間的交互,來爲java程序員提供內存可見性保證。

原子性

JMM提供保證了訪問基本數據類型的原子性(其實在寫一個工作內存變量到主內存是分主要兩步:store、write),但是實際業務處理場景往往是需要更大的範圍的原子性保證,所以模型也提供了synchronized塊來保證

有序性

這個概念是相對而言的,如果在本線程內,所有的操作都是有序的,如果在一個線程觀察另一個線程,所有的操作都是無序的,前句是“線程內表現爲串行行爲”,後句是“指令的重排序”和“工作內存和主內存同步延遲”現象,模型提供了volatile和synchronized來保證線程之間操作的有序性。

重排序

在執行程序時爲了提高性能,編譯器和處理器常常會對指令做重排序(編譯器、處理器),就是因爲這些重排序,所以可能會導致多線程程序出現內存可見性問題(數據安全問題)和有序性問題。
JMM是如何處理的呢?
對於編譯器,JMM的編譯器重排序規則會禁止特定類型的編譯器重排序
對於處理器重排序,JMM的處理器重排序規則會要求java編譯器在生成指令序列時,插入特定類型的內存屏障(memory barriers,intel稱之爲memory fence)指令,通過內存屏障指令來禁止特定類型的處理器重排序
總之一句話,JMM是通過禁止特定類型的編譯器重排序和處理器重排序來爲程序員提供一致的內存可見性保證。

Happens-Before

用happens-before的概念來闡述操作之間的內存可見性。在JMM中,如果一個操作執行的結果需要對另一個操作可見,那麼這兩個操作之間必須要存在happens-before關係 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章