Java內存模型

出處:http://www.cnblogs.com/dolphin0520/

Java內存模型(Java Memory Model,JMM)

內存模型規定:

  1. 所有的變量都是存在主存當中(類似于物理內存)
  2. 每個線程都有自己的工作內存(類似于高速緩存)
  3. 線程對變量的所有操作都必須在工作內存中進行,而不能直接對主存進行操作。
  4. 每個線程不能訪問其他線程的工作內存。

緩存一致性(Cache coherence)問題

當程序在運行過程中,會將運算需要的數據從主存復制一份到CPU的高速緩存當中,那么CPU進行計算時就可以直接從它的高速緩存讀取數據和向其中寫入數據,當運算結束之后,再將高速緩存中的數據刷新到主存當中

在一個系統中,當許多不同的設備共享一個共同存儲器資源,在高速緩存中的數據不一致,就會產生問題。也就是說如果一個變量在多個CPU中都存在緩存(一般在多線程編程時才會出現),那么就可能存在緩存不一致的問題。

緩存一致性可以分為三個層級:

  • 在進行每個寫入運算時都立刻采取措施保證數據一致性
  • 每個獨立的運算,假如它造成數據值的改變,所有進程都可以看到一致的改變結果
  • 在每次運算之后,不同的進程可能會看到不同的值(這也就是沒有一致性的行為)

為了解決緩存不一致性問題,通常來說有以下2種解決方法:

1.通過在總線加LOCK鎖的方式
2.通過緩存一致性協議。

最出名的就是Intel 的MESI協議,MESI協議保證了每個緩存中使用的共享變量的副本是一致的。

它核心的思想是:當CPU寫數據時,如果發現操作的變量是共享變量,即在其他CPU中也存在該變量的副本,會發出信號通知其他CPU將該變量的緩存行置為無效狀態,因此當其他CPU需要讀取這個變量時,發現自己緩存中緩存該變量的緩存行是無效的,那么它就會從內存重新讀取。


參考資料

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容