并發(fā)編程-Java內(nèi)存模型(JMM)

上一篇 <<<鎖的優(yōu)化
下一篇 >>>Volatile解決JMM的可見性問題


Java內(nèi)存模型(JMM):定義了一個線程對另一個線程可見。

JMM和JVM的區(qū)別

  • JVM是內(nèi)存結(jié)構(gòu)
  • JMM是內(nèi)存模型

JMM核心

定義了線程和主內(nèi)存之間的抽象關(guān)系:
線程之間的共享變量存儲在主內(nèi)存(main memory)中,每個線程都有一個私有的本地內(nèi)存(local memory),本地內(nèi)存中存儲了該線程以讀/寫共享變量的副本。
本地內(nèi)存是JMM的一個抽象概念,并不真實存在。它涵蓋了緩存,寫緩沖區(qū),寄存器以及其他的硬件和編譯器優(yōu)化。

主內(nèi)存:
存放我們共享變量的數(shù)據(jù)
工作內(nèi)存:
每個CPU對共享變量(主內(nèi)存)的副本。堆+方法區(qū)
注意:當多個線程同時訪問一個數(shù)據(jù)的時候,可能本地內(nèi)存A沒有及時刷新到主內(nèi)存中,本地內(nèi)存B讀取的時候會造成臟讀,也就是會發(fā)生線程安全問題。但加上關(guān)鍵字Volatile就會立馬告知。

JMM同步8大步驟

  • (1)lock(鎖定):作用于 主內(nèi)存的變量,把一個變量標記為一條線程獨占狀態(tài)
  • (2)unlock(解鎖):作用于 主內(nèi)存的變量,把一個處于鎖定狀態(tài)的變量釋放出來,釋放后的變量才可以被其他線程鎖定
  • (3)read(讀取):作用于 主內(nèi)存的變量,把一個變量值從主內(nèi)存?zhèn)鬏數(shù)骄€程的 工作內(nèi)存中,以便隨后的load動作使用
  • (4)load(載入):作用于 工作內(nèi)存的變量,它把read操作從主內(nèi)存中得到的變量值放入工作內(nèi)存的變量副本中
  • (5)use(使用):作用于 工作內(nèi)存的變量,把工作內(nèi)存中的一個變量值傳遞給執(zhí)行引擎
  • (6)assign(賦值):作用于 工作內(nèi)存的變量,它把一個從執(zhí)行引擎接收到的值賦給工作內(nèi)存的變量
  • (7)store(存儲):作用于 工作內(nèi)存的變量,把工作內(nèi)存中的一個變量的值傳送到 主內(nèi)存中,以便隨后的write的操作?!綜PU總線和嗅探機制,含MESI協(xié)議】
  • (8)write(寫入):作用于 工作內(nèi)存的變量,它把store操作從工作內(nèi)存中的一個變量的值傳送到 主內(nèi)存的變量中

相關(guān)文章鏈接:
<<<多線程基礎(chǔ)
<<<線程安全與解決方案
<<<鎖的深入化
<<<鎖的優(yōu)化
<<<Volatile解決JMM的可見性問題
<<<Volatile的偽共享和重排序
<<<CAS無鎖模式及ABA問題
<<<Synchronized鎖
<<<Lock鎖
<<<AQS同步器
<<<Condition
<<<CountDownLatch同步計數(shù)器
<<<Semaphore信號量
<<<CyclicBarrier屏障
<<<線程池
<<<并發(fā)隊列
<<<Callable與Future模式
<<<Fork/Join框架
<<<Threadlocal
<<<Disruptor框架
<<<如何優(yōu)化多線程總結(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容