一 硬件內存架構
CPU處理速度遠大於內存處理速度,因此中間設置有高速緩存(cache,可以有多級)。這樣會引發數據的一致性問題,即對於共享的數據而言,怎樣保證各個CPU拿到的一致。
解決方案:
1. 總線加鎖。優點:實現簡單;缺點:降低CPU吞吐量。
2. 緩存一致性協議(MESI)
當CPU在CACHE中操作數據時,如果該數據是共享變量,數據在CACHE讀到寄存器中,進行新修改,並更新內存數據
CACHE LINE置無效,其他的CPU就從內存中讀數據。
二 JMM
JMM,即JAVA內存模型,是一種規範,是一個概念。
JMM將內存分爲兩類:共享內存(主內存)和工作內存(工作空間)。
1. 共享內存:所有線程共享的內存空間。
2. 工作內存:線程私有的內存空間。
對於引用對象而言,引用的地址放在工作內存,引用的對象放在堆中。
3. 工作方式
- 線程修改私有數據,直接在工作空間修改
- 線程修改共享數據,把數據複製到工作空間中去,在工作空間中修改,修改完成以後,刷新內存中的數據
三 JMM與硬件內存的對應關係
四 JMM要保證的3個特性
原子性:不可分割
可見性:線程只能操作自己工作空間中的數據,對於共享數據,有線程修改了其值,如何保證其他線程可見。
有序性:程序中的順序不一定就是執行的順序:編譯重排序、指令重排序(目的是 提高效率)
JMM如何保證原子性的方式: Synchronized;加鎖,使用JUC(java.util.concurrent併發包)中的鎖 lock。
JMM如何保證可見性的方式: Volatile;Synchronized;加鎖,使用JUC(java.util.concurrent併發包)中的鎖 lock。
JMM如何保證有序性: Volatile;Synchronized;Happens-before原則:
- 程序次序原則
- 鎖定原則 :後一次加鎖必須等前一次解鎖
- Volatile原則:霸道原則
- 傳遞原則:A---B ---C A--C
五 JVM內存區域與JMM
JVM內存區域是JVM使用內存區域的一種虛擬劃分;JMM是一種規範,一種概念,面向的問題是原子性、可見性和有序性。