為了支持 JMM,Java 定義了 8 種原子操作(Action),用來(lái)控制主存與工作內(nèi)存之間的交互:
read讀取:作用于主內(nèi)存,將共享變量從主內(nèi)存?zhèn)鲃?dòng)到線程的工作內(nèi)存中,供后面的 load 動(dòng)作使用。
load載入:作用于工作內(nèi)存,把 read 讀取的值放到工作內(nèi)存中的副本變量中。
store存儲(chǔ):作用于工作內(nèi)存,把工作內(nèi)存中的變量傳送到主內(nèi)存中,為隨后的 write 操作使用。
write寫(xiě)入:作用于主內(nèi)存,把 store 傳送值寫(xiě)到主內(nèi)存的變量中。
use使用:作用于工作內(nèi)存,把工作內(nèi)存的值傳遞給執(zhí)行引擎,當(dāng)虛擬機(jī)遇到一個(gè)需要使用這個(gè)變量的指令,就會(huì)執(zhí)行這個(gè)動(dòng)作。
assign賦值:作用于工作內(nèi)存,把執(zhí)行引擎獲取到的值賦值給工作內(nèi)存中的變量,當(dāng)虛擬機(jī)棧遇到給變量賦值的指令,執(zhí)行該操作。比如 int i = 1;
lock(鎖定)作用于主內(nèi)存,把變量標(biāo)記為線程獨(dú)占狀態(tài)。
unlock(解鎖)作用于主內(nèi)存,它將釋放獨(dú)占狀態(tài)。
深入淺出 Java 虛擬機(jī)
如上圖所示,把一個(gè)變量數(shù)據(jù)從主內(nèi)存復(fù)制到工作內(nèi)存,要順序執(zhí)行 read 和 load;而把變量數(shù)據(jù)從工作內(nèi)存同步回主內(nèi)存,就要順序執(zhí)行 store 和 write 操作。
由于重排序、原子性、內(nèi)存可見(jiàn)性,帶來(lái)的不一致問(wèn)題,JMM 通過(guò) 八個(gè)原子動(dòng)作,內(nèi)存屏障保證了并發(fā)語(yǔ)義關(guān)鍵字的代碼能夠?qū)崿F(xiàn)對(duì)應(yīng)的安全并發(fā)訪問(wèn)。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.