內(nèi)存模型
共享變量式內(nèi)存模型
線程的同步和通信
計(jì)算機(jī)結(jié)構(gòu)
cpu內(nèi),有多核,每個(gè)核有單獨(dú)的寄存器,一級(jí)緩存,二級(jí)緩存
cpu處理器外,跟主存(RAM)去通信。
java的內(nèi)存分配
虛擬機(jī)棧
堆
本地方法棧
程序記數(shù)器
方法區(qū)
其中棧和堆都是在主存上分配的一塊區(qū)域。
其中棧空間比較小,存放:
1.八種基本類型和對(duì)象的引用
2.方法的出入棧信息
3.操作指令
是一塊連續(xù)的區(qū)域
java內(nèi)存模型的實(shí)現(xiàn)原理
主要就是兩個(gè)問題:
- 線程間的通信
- 線程間的同步互斥
其中,同步互斥依賴的是Synchronized關(guān)鍵字和ReentLock工具類
而volitile關(guān)鍵字,保證線程對(duì)共享變量的可見行,實(shí)現(xiàn)的通信。
volitile關(guān)鍵字的原理,是內(nèi)存屏障
保證了變量的可見行和防止編譯器對(duì)字節(jié)碼重排序
不同的線程會(huì)有本地變量(對(duì)應(yīng)的計(jì)算機(jī)物理結(jié)構(gòu),就是線程處在不同的cpu核心下)。這個(gè)本地變量是RAM主存下的副本。所以有可能值會(huì)不同。
本volitile關(guān)鍵字修飾的變量,在jvm編譯成字節(jié)碼時(shí),會(huì)在這個(gè)變量前,生成對(duì)應(yīng)的操作系統(tǒng)內(nèi)存屏障指令集。
具體:
- 寫操作,會(huì)強(qiáng)制把線程本地變量刷新到主內(nèi)存
- 讀操作,會(huì)強(qiáng)制把主內(nèi)存的數(shù)據(jù)刷新到線程本地變量副本里
threadLocal 線程本地變量
volatile保證線程間對(duì)變量的可見性,而threadLocal確實(shí)保證,變量在每個(gè)線程里都是獨(dú)立的副本,相互之前不受影響。原理數(shù)據(jù)結(jié)構(gòu)
- 每個(gè)線程Thread內(nèi)都有一個(gè)threadLocalMap的變量。
- threadLocalMap是threadLocal里的靜態(tài)內(nèi)部類。這個(gè)map存放的key是threadLocal,value是對(duì)應(yīng)的變量值object類型
- 線程獲取線程獨(dú)立變量值的過程,Thread.currentThread獲取當(dāng)前線程,從該線程里threadLocalMap變量里獲取key為threadLocal的value值。