java 內存模型(JMM)簡介


轉載地址:http://364434006.iteye.com/blog/1810816


JMM:Java Memory Model(Java內存模型),圍繞着在併發過程中如何處理可見性、原子性、有序性這三個特性而建立的模型。

可見性: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是通過禁止特定類型的編譯器重排序和處理器重排序來爲程序員提供一致的內存可見性保證。

A線程具體什麼時候刷新共享數據到主內存是不確定的,假設我們使用了同步原語(synchronized,volatile和final),那麼刷新的時間是確定的,例如:線程A釋放鎖後會同步到主內存,線程B獲取鎖後會同步主內存數據
即“A線程釋放鎖--B線程獲取鎖”可以實現A,B線程之間的通信

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