Thread ---java 內存模型

1,Java 線程之間的通訊由Java 內存模型(JMM)控制。JMM決定一個線程對共享變量的寫入時,能對另外一個線程可見java

從抽象的角度來看,JMM定義了線程和主內存之間的抽象關係:程序員

線程之間的共享變量存儲在主內存(main memory)中,緩存

每一個線程都有一個私有的本地內存(local memory),優化

本地內存中存儲了該線程以讀/寫共享變量的副本。本地內存是JMM的一個抽象概念,並不真實存在。它涵蓋了緩存,寫緩衝區,寄存器以及其餘的硬件和編譯器優化。spa

2線程

blog

從上圖來看,線程A與線程B之間如要通訊的話,必需要經歷下面2個步驟:內存

 

1. 首先,線程A把本地內存A中更新過的共享變量刷新到主內存中去。編譯器

 

2. 而後,線程B到主內存中去讀取線程A以前已更新過的共享變量。編譯

 

下面經過示意圖來講明這兩個步驟: 

如上圖所示,本地內存AB有主內存中共享變量x的副本。假設初始時,這三個內存中的x值都爲0。線程A在執行時,把更新後的x值(假設值爲1)臨時存放在本身的本地內存A中。當線程A和線程B須要通訊時,線程A首先會把本身本地內存中修改後的x值刷新到主內存中,此時主內存中的x值變爲了1。隨後,線程B到主內存中去讀取線程A更新後的x值,此時線程B的本地內存的x值也變爲了1

從總體來看,這兩個步驟實質上是線程A在向線程B發送消息,並且這個通訊過程必需要通過主內存。JMM經過控制主內存與每一個線程的本地內存之間的交互,來爲java程序員提供內存可見性保證。

相關文章
相關標籤/搜索