1、基本概念
-
程序:代碼,是為了完成某一個任務,代碼序列(靜態的概念)
-
進程:程序在某些數據上的一次運行(動態的概念)
-
線程:一個進程可能包含一個或多個線程(占有資源的獨立單元)
2、JVM與線程
JVM什么時候啟動?
類被調用是時啟動JVM,JVM線程 啟動 其他線程(mian...)
3、JVM內存模型

-
方法區:類信息,常量,static變量,JIT (利用反射加載類)
-
堆:實例對象
-
VM stack:Java方法在運行時的內存模型
-
native method stack:Java本地方法運行的內存模型,與VM stack基本一樣
-
程序計數器:存儲執行下一條指令的地址
-
方法區、堆是所有線程共享的,虛擬機棧、本地方法棧、程序計數器都是線程私有的
VM stack圖解:

4、Java內存模型 JMM(Java Memory Model)(這是一個規范,抽象的模型)

-
主內存:共享的信息
-
工作內存:私有信息,基本數據類型,直接分配到工作內存;引用數據類型:引用的地址存放在工作內存,引用的對象存放在堆中
-
工作方式:
-
線程修改私有數據:直接在工作空間修改
-
線程修改共享數據:把數據復制到工作空間中去,在工作空間中修改,修改完成以后,刷新內存中的數據
5、硬件內存架構與JMM
1. 硬件架構

-
CPU緩存的一致性問題:並發處理的不同步
-
解決方案
-
總線枷鎖,降低CPU吞吐量
-
緩存上的一致性協議(MESI)
-
當CPU在CACHE中操作數據時,如果該數據是共享變量,數據在CACHE讀到寄存器中,進行新修改,並更新內存數據
-
CaCHE LINE置無效,其他的CPU就從內存中讀數據
6、Java內存模型的必要性
Java內存模型的作用:規范內存數據和工作空間數據的交互
7、並發編程的三個重要特性
-
原子性:不可分割
-
可見性:線程只能操作自己工作空間內的數據
-
有序性:程序中的順序不一定就是執行的順序
-
編譯重排序
-
指令重排序
-
重排目的:提高運行效率
-
as-if-seria:單線程中重排后不影響執行的結果,多線程
-
happens-before:
8、JMM對三個特征的保證
-
JMM與原子性
-
X=10 寫 原子性 如果是私有數據具有原子性,如果是共享數據沒原子性
-
Y=X 沒有原子性
-
把數據X讀到工作空間(原子性)
-
把X的值寫到Y(原子性)
-
i++ 沒有原子性
-
讀取i的值到工作空間
-
i+1
-
刷新結果到內存
-
z=z+1 沒有原子性
-
結論:多個原子性的操作合並到一個沒有原子性
-
解決方法:synchronized、JUC Lock的lock
-
JMM與可見性
-
volatile:在JMM模型上實現MESI的協議
-
synchronized:加鎖
-
JUC:Lock的lock
-
JMM與有序性
-
volatile
-
synchronized
-
happens-before原則
-
程序次序原則
-
鎖定原則:后一次加鎖必須要等前一次解鎖
-
volatile原則
-
傳遞原則
下次為大家詳解synchronized、volatile等原則