上一篇 <<<鎖的優(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ū)
注意:當(dāng)多個線程同時訪問一個數(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的操作芭概∪唬【CPU總線和嗅探機制,含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é)