JMM&并發(fā)三大特性--可見(jiàn)性

一. 并發(fā)與并行區(qū)別

目標(biāo)都是最大化CPU使用率

1. 區(qū)別

并行:在同一時(shí)間內(nèi),有多條指令在多個(gè)處理器上執(zhí)行(取決于CPU核數(shù)量)


CPU并行圖.png

并發(fā):在同一時(shí)間內(nèi),只能有一條指令執(zhí)行,但有多個(gè)進(jìn)程指令快速交替輪換,在宏觀上造成具有多個(gè)進(jìn)程同時(shí)執(zhí)行的效果


CPU并發(fā)圖.png

2. 并發(fā)三大特性

(1)可見(jiàn)性:當(dāng)一個(gè)線程修改了共享變量的值,其他線程能夠看到修改的值。
(2)原子性:一個(gè)或多個(gè)操作,要么全部執(zhí)行且在執(zhí)行過(guò)程中不被任何因素打斷,要么全部不執(zhí)行。
(3)有序性:即程序執(zhí)行的順序按照代碼的先后順序執(zhí)行。

二. JMM運(yùn)行原理

JMM運(yùn)行原理.png

(1)注:產(chǎn)生于線程中的值什么時(shí)候刷回到主內(nèi)存?
不會(huì)立即刷新到主內(nèi)存,該變量在線程中無(wú)用時(shí),回收該值同時(shí)刷回主內(nèi)存
(2)注2:本地內(nèi)存淘汰策略

  • 釋放時(shí)間片方式:加載最新上下文,更新緩存中的值(方法:Thread.yield())
    上下文切換示意圖:


    上下文切換示意圖.png
計(jì)算機(jī)指令運(yùn)行原理.png

三. java并發(fā)安全機(jī)制--保證多線程可見(jiàn)性

3.0 思維導(dǎo)圖

思維導(dǎo)圖.png

3.1 volatile原理(采用內(nèi)存屏障機(jī)制)

字節(jié)碼解釋器底層實(shí)現(xiàn)(monitorenter)

if (cache->is_volatile()) {
  orderAccess::storeLoad();    // 內(nèi)存屏障(JVM層面)
}

3.2 Lock前綴指令作用

(1)保證本地內(nèi)存立刻回寫主內(nèi)存
(2)通知其他線程緩存立刻失效,迫使其必須從主內(nèi)存中拉取數(shù)據(jù)
(3)注1:Lock非內(nèi)存屏障,但有相同的效果
注2:有令線程緩存失效的效果

3.3 synchorized機(jī)制

底層使用內(nèi)存屏障 storefence(與volatile類似)

3.4 Thread.sleep()機(jī)制

底層使用內(nèi)存屏障機(jī)制實(shí)現(xiàn)并發(fā)安全

int os::sleep() {
  . . .
  orderAccess::fence();
  . . .
}

3.5 通過(guò)final關(guān)鍵字保證多線程可見(jiàn)性

3.6 Thread.yield()方法

通過(guò)上下文切換,切換過(guò)程中系統(tǒng)更新多線程緩存中的值,實(shí)現(xiàn)可見(jiàn)性

3.7 總結(jié)

(1)內(nèi)存屏障:storeFence (x86系統(tǒng)下)
(2)上下文切換方式:Thread.yield()

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

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

  • JMM屬于整個(gè)Java并發(fā)編程中最難的部分也是最重要的部分(JAVA多線程通信模型——共享內(nèi)存模型),涉及的理論知...
    Curtain_call閱讀 379評(píng)論 0 2
  • CPU緩存架構(gòu)&緩存一致性協(xié)議詳解 1.CPU高速緩存(Cache Memory) 定義:CPU緩存即高速緩沖存儲(chǔ)...
    Curtain_call閱讀 251評(píng)論 0 1
  • 多線程 什么是上下文切換多線程編程中一般線程的個(gè)數(shù)都大于 CPU 核心的個(gè)數(shù),而一個(gè) CPU 核心在任意時(shí)刻只能被...
    sizuoyi00閱讀 591評(píng)論 0 0
  • 并發(fā)編程-JMM Q&A 什么是多線程并發(fā)編程? 多線程編程中,線程個(gè)數(shù)往往多于CPU核數(shù) 為什么要進(jìn)行多線程并發(fā)...
    愛(ài)睡覺(jué)的Boy_ed44閱讀 140評(píng)論 0 0
  • 1.并發(fā)編程三要素 原子性 原子,即一個(gè)不可再被分割的顆粒。在Java中原子性指的是一個(gè)或多個(gè)操作要么全部執(zhí)行成功...
    huang_liang_a閱讀 1,157評(píng)論 0 0

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