硬件內(nèi)存與java內(nèi)存模型

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ī)棧中的部分

?著作權(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)容