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