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