java內(nèi)存模型 volatile threadLocal

內(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è)問題:

  1. 線程間的通信
  2. 線程間的同步互斥

其中,同步互斥依賴的是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)存屏障指令集。
具體:

  1. 寫操作,會(huì)強(qiáng)制把線程本地變量刷新到主內(nèi)存
  2. 讀操作,會(huì)強(qiáng)制把主內(nèi)存的數(shù)據(jù)刷新到線程本地變量副本里
threadLocal 線程本地變量

volatile保證線程間對(duì)變量的可見性,而threadLocal確實(shí)保證,變量在每個(gè)線程里都是獨(dú)立的副本,相互之前不受影響。原理數(shù)據(jù)結(jié)構(gòu)

  1. 每個(gè)線程Thread內(nèi)都有一個(gè)threadLocalMap的變量。
  2. threadLocalMap是threadLocal里的靜態(tài)內(nèi)部類。這個(gè)map存放的key是threadLocal,value是對(duì)應(yīng)的變量值object類型
  3. 線程獲取線程獨(dú)立變量值的過程,Thread.currentThread獲取當(dāng)前線程,從該線程里threadLocalMap變量里獲取key為threadLocal的value值。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容