CPU操作速度, 寄存器 > 緩存 > 主存 ?主存也叫RAM
? ? ? ? 不管是棧和堆大部分都會(huì)存儲(chǔ)到主存中,一部分堆和棧的數(shù)據(jù)可能會(huì)存儲(chǔ)到寄存器中
當(dāng)對(duì)象中的各變量存儲(chǔ)到計(jì)算機(jī)內(nèi)存時(shí):
1. 共享對(duì)象對(duì)各個(gè)線程的可見(jiàn)性
2. 共享對(duì)象的競(jìng)爭(zhēng)現(xiàn)象
CPU的線程讀取主存中的共享變量到緩存中, 然后對(duì)共享變量的更改沒(méi)有同步到主存中,此時(shí)對(duì)另一個(gè)線程來(lái)說(shuō)共享變量將無(wú)法更新可以使用violate關(guān)鍵字:violate關(guān)鍵字將直接從主存中讀取,對(duì)變量的更新也會(huì)直接寫入到主存中, violate基于內(nèi)存屏障指令實(shí)現(xiàn)
violate ?可見(jiàn)性, 原子性, 禁止JVM指令重排
內(nèi)存屏障:
保證特定操作的執(zhí)行順序,影響某些數(shù)據(jù)(或則是某條指令的執(zhí)行結(jié)果)的內(nèi)存可見(jiàn)性
指令重排:
? 在計(jì)算機(jī)執(zhí)行指令的順序在經(jīng)過(guò)程序編譯器編譯之后形成的指令序列, CPU和編譯器為了提高程序的執(zhí)行效率,會(huì)按照一定的規(guī)則進(jìn)行指令優(yōu)化,在某些情況下會(huì)產(chǎn)生邏輯問(wèn)題, 在并發(fā)情況下會(huì)產(chǎn)生二義性
as-if-serial: 不管怎么排序,單線程的執(zhí)行結(jié)果不會(huì)變
as-if-serial語(yǔ)義把單線程程序保護(hù)了起來(lái),遵守as-if-serial語(yǔ)義的編譯器,runtime 和處理器共同為編寫單線程程序的程序員創(chuàng)建了一個(gè)幻覺(jué):?jiǎn)尉€程程序是按程序的順序來(lái)執(zhí)行的。as-if-serial語(yǔ)義使單線程程序員無(wú)需擔(dān)心重排序會(huì)干擾他們,也無(wú)需擔(dān)心內(nèi)存可見(jiàn)性問(wèn)題
java 內(nèi)存模型
所有的變量都存儲(chǔ)在主內(nèi)存中,每個(gè)線程都有自己的工作內(nèi)存,線程的工作內(nèi)存中保存了線程變量的主內(nèi)內(nèi)存拷貝,線程對(duì)所有變量的操作都必須在工作內(nèi)存中進(jìn)行,而不能直接讀寫主內(nèi)存變量
主內(nèi)存主要對(duì)應(yīng)java堆中的對(duì)象實(shí)例數(shù)據(jù)部分, 工作內(nèi)存主要對(duì)應(yīng)于java虛擬機(jī)棧中的部分