硬件內存模型
不管是什么內存模型,最終還是運行在計算機硬件上的,所以我們有必要了解計算機硬件內存架構
現代計算機一般都有2個以上CPU,而且每個CPU還有可能包含多個核心。因此,如果我們的應用是多線程的話,這些線程可能會在各個CPU核心中并行運行。
在CPU內部有一組CPU寄存器,也就是CPU的儲存器。CPU操作寄存器的速度要比操作計算機主存快的多。在主存和CPU寄存器之間還存在一個CPU緩存,CPU操作CPU緩存的速度快于主存但慢于CPU寄存器。某些CPU可能有多個緩存層(一級緩存和二級緩存)。
當一個CPU需要訪問主存時,會先讀取一部分主存數據到CPU緩存,進而在讀取CPU緩存到寄存器。當CPU需要寫數據到主存時,同樣會先flush寄存器到CPU緩存,然后再在某些節點把緩存數據flush到主存。
JMM
Java內存模型即Java Memory Model,簡稱JMM。JMM定義了Java虛擬機在計算機內存中的工作方式。JVM是整個計算機虛擬模型,所以JMM是隸屬于JVM的。
Java內存模型定義了多線程之間共享變量的可見性以及如何在需要的時候對共享變量進行同步。原始的Java內存模型效率并不是很理想,因此Java1.5版本對其進行了重構,現在的Java8仍沿用了Java1.5的版本。
在硬件內存模型里面關心的是不同CPU的緩存之間如何保證數據一致性,在Java內存模型里面關心的是不同線程之間的共享變量的一致性。
JVM對Java內存模型的實現
Java內存模型和硬件架構之間的橋接
Java內存模型和硬件內存架構并不一致。硬件內存架構中并沒有區分棧和堆,從硬件上看,不管是棧還是堆,大部分數據都會存到主存中,當然一部分棧和堆的數據也有可能會存到CPU寄存器中,如下圖所示,Java內存模型和計算機硬件內存架構是一個交叉關系:
支撐Java內存模型的基礎原理
- 指令重排
- 數據依賴性
- as-if-serial
- 內存屏障
- happens-before