內(nèi)存模型
共享變量式內(nèi)存模型
線程的同步和通信
計算機結(jié)構(gòu)
cpu內(nèi)橘原,有多核利赋,每個核有單獨的寄存器郁惜,一級緩存堡距,二級緩存
cpu處理器外,跟主存(RAM)去通信扳炬。
java的內(nèi)存分配
虛擬機棧
堆
本地方法棧
程序記數(shù)器
方法區(qū)
其中棧和堆都是在主存上分配的一塊區(qū)域吏颖。
其中棧空間比較小恨樟,存放:
1.八種基本類型和對象的引用
2.方法的出入棧信息
3.操作指令
是一塊連續(xù)的區(qū)域
java內(nèi)存模型的實現(xiàn)原理
主要就是兩個問題:
- 線程間的通信
- 線程間的同步互斥
其中半醉,同步互斥依賴的是Synchronized關(guān)鍵字和ReentLock工具類
而volitile關(guān)鍵字,保證線程對共享變量的可見行劝术,實現(xiàn)的通信缩多。
volitile關(guān)鍵字的原理,是內(nèi)存屏障
保證了變量的可見行和防止編譯器對字節(jié)碼重排序
不同的線程會有本地變量(對應的計算機物理結(jié)構(gòu)养晋,就是線程處在不同的cpu核心下)衬吆。這個本地變量是RAM主存下的副本。所以有可能值會不同绳泉。
本volitile關(guān)鍵字修飾的變量逊抡,在jvm編譯成字節(jié)碼時,會在這個變量前零酪,生成對應的操作系統(tǒng)內(nèi)存屏障指令集冒嫡。
具體:
- 寫操作,會強制把線程本地變量刷新到主內(nèi)存
- 讀操作四苇,會強制把主內(nèi)存的數(shù)據(jù)刷新到線程本地變量副本里
threadLocal 線程本地變量
volatile保證線程間對變量的可見性孝凌,而threadLocal確實保證,變量在每個線程里都是獨立的副本月腋,相互之前不受影響蟀架。原理數(shù)據(jù)結(jié)構(gòu)
- 每個線程Thread內(nèi)都有一個threadLocalMap的變量。
- threadLocalMap是threadLocal里的靜態(tài)內(nèi)部類榆骚。這個map存放的key是threadLocal片拍,value是對應的變量值object類型
- 線程獲取線程獨立變量值的過程,Thread.currentThread獲取當前線程妓肢,從該線程里threadLocalMap變量里獲取key為threadLocal的value值穆碎。