java內存模型

一、併發編程中需要考慮的兩個問題:線程之間的通信和同步

二、併發模型:共享內存,消息傳遞

在共享內存的併發模型中,線程之間通過寫-讀內存中的公共狀態進行隱式通信,而對於同步,是顯式進行的。程序員必須顯式指定某個方法或某段代碼需要在線程之間互斥執行;

在消息傳遞的併發模型中,線程之間沒有公共狀態,線程之間必須通過明確的發送消息來顯式進行通信,而對於同步,由於消息的發送必須在消息的接收之前,因此同步是隱式進行的。

java 的併發採用的是共享內存模型,Java 線程之間的通信總是隱式進行,整個通信過程對程序員完全透明。

三、java內存模型(共享內存模型)

1.java 中,所有實例域、靜態域和數組元素存儲在堆內存中,堆內存在線程之間共享。局部變量(Local variables),方法定義參數(java 語言規範稱之爲 formal method parameters)和異常處理器參數(exception handler parameters)不會在線程之間共享,也不受內存模型的影響。

2.Java 線程之間的通信由 Java 內存模型(本文簡稱爲 JMM)控制,JMM 決定一個線程對共享變量的寫入何時對另一個線程可見。JMM 定義了線程和主內存之間的抽象關係:線程之間的共享變量存儲在主內存(main memory)中,每個線程都有一個私有的本地內存(local memory),本地內存中存儲了該線程以讀 / 寫共享變量的副本。本地內存是 JMM 的一個抽象概念,並不真實存在。它涵蓋了緩存,寫緩衝區,寄存器以及其他的硬件和編譯器優化。Java 內存模型的抽象示意圖如下:

線程 A 與線程 B 之間通信,必須經歷2 個步驟:

(1)線程 A 把本地內存 A 中更新過的共享變量刷新到主內存中去。

(2)線程 B 到主內存中去讀取線程 A 之前已更新過的共享變量。

 

 

參考博客地址:http://cmsblogs.com/?p=3992

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