出處:http://www.cnblogs.com/dolphin0520/
Java內存模型(Java Memory Model,JMM)
內存模型規定:
- 所有的變量都是存在主存當中(類似于物理內存)
- 每個線程都有自己的工作內存(類似于高速緩存)
- 線程對變量的所有操作都必須在工作內存中進行,而不能直接對主存進行操作。
- 每個線程不能訪問其他線程的工作內存。
緩存一致性(Cache coherence)問題
當程序在運行過程中,會將運算需要的數據從主存復制一份到CPU的高速緩存當中,那么CPU進行計算時就可以直接從它的高速緩存讀取數據和向其中寫入數據,當運算結束之后,再將高速緩存中的數據刷新到主存當中
在一個系統中,當許多不同的設備共享一個共同存儲器資源,在高速緩存中的數據不一致,就會產生問題。也就是說如果一個變量在多個CPU中都存在緩存(一般在多線程編程時才會出現),那么就可能存在緩存不一致的問題。
緩存一致性可以分為三個層級:
- 在進行每個寫入運算時都立刻采取措施保證數據一致性
- 每個獨立的運算,假如它造成數據值的改變,所有進程都可以看到一致的改變結果
- 在每次運算之后,不同的進程可能會看到不同的值(這也就是沒有一致性的行為)
為了解決緩存不一致性問題,通常來說有以下2種解決方法:
1.通過在總線加LOCK鎖的方式
2.通過緩存一致性協議。
最出名的就是Intel 的MESI協議,MESI協議保證了每個緩存中使用的共享變量的副本是一致的。
它核心的思想是:當CPU寫數據時,如果發現操作的變量是共享變量,即在其他CPU中也存在該變量的副本,會發出信號通知其他CPU將該變量的緩存行置為無效狀態,因此當其他CPU需要讀取這個變量時,發現自己緩存中緩存該變量的緩存行是無效的,那么它就會從內存重新讀取。
參考資料