Java 并發(fā)模型

在之前的文章中,我們了解到了計(jì)算機(jī)為什么會(huì)出現(xiàn)指令重排、指令重排引起的問題、為了解決指令重排而引入的緩存一致性和內(nèi)存屏障等。

那么既然在多核時(shí)代計(jì)算機(jī)已經(jīng)保證了執(zhí)行結(jié)果的正確性,是不是對(duì)于JVM就不用去考慮這些東西了呢?

答案當(dāng)然不是。首先,因?yàn)椴煌挠布軜?gòu)所實(shí)現(xiàn)的緩存一致性并不相同,JVM需要將這些實(shí)現(xiàn)進(jìn)行統(tǒng)一;其次,緩存一致性協(xié)議只是保證了CPU緩存層面的可見性問題,然而Java多線程模型中,在線程棧內(nèi)自己維護(hù)一份緩存是常見的優(yōu)化措施,這部分工作內(nèi)存還包括內(nèi)存中的一部分(Java內(nèi)存模型和計(jì)算機(jī)硬件內(nèi)存架構(gòu)是一個(gè)交叉關(guān)系),顯然緩存一致性協(xié)議并不能解決不同線程之間在內(nèi)存中的一致性問題;最后,是由于編譯器的導(dǎo)致的重排序問題。

Java是通過volatile、synchronized和鎖來解決以上的問題的

Java 工作內(nèi)存和主內(nèi)存的交互

Java通過幾種原子操作完成工作內(nèi)存和主內(nèi)存的交互:

  1. lock:作用于主內(nèi)存,把變量標(biāo)識(shí)為線程獨(dú)占狀態(tài)。
  2. unlock:作用于主內(nèi)存,解除獨(dú)占狀態(tài)。
  3. read:作用主內(nèi)存,把一個(gè)變量的值從主內(nèi)存?zhèn)鬏數(shù)骄€程的工作內(nèi)存。
  4. load:作用于工作內(nèi)存,把read操作傳過來的變量值放入工作內(nèi)存的變量副本中。
  5. use:作用工作內(nèi)存,把工作內(nèi)存當(dāng)中的一個(gè)變量值傳給執(zhí)行引擎。
  6. assign:作用工作內(nèi)存,把一個(gè)從執(zhí)行引擎接收到的值賦值給工作內(nèi)存的變量。
  7. store:作用于工作內(nèi)存的變量,把工作內(nèi)存的一個(gè)變量的值傳送到主內(nèi)存中。
  8. write:作用于主內(nèi)存的變量,把store操作傳來的變量的值放入主內(nèi)存的變量中。

JVM對(duì)內(nèi)存屏障的封裝


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。