一. 并發(fā)與并行區(qū)別
目標(biāo)都是最大化CPU使用率
1. 區(qū)別
并行:在同一時(shí)間內(nèi),有多條指令在多個(gè)處理器上執(zhí)行(取決于CPU核數(shù)量)

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

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

(1)注:產(chǎn)生于線程中的值什么時(shí)候刷回到主內(nèi)存?
不會(huì)立即刷新到主內(nèi)存,該變量在線程中無(wú)用時(shí),回收該值同時(shí)刷回主內(nèi)存
(2)注2:本地內(nèi)存淘汰策略
-
釋放時(shí)間片方式:加載最新上下文,更新緩存中的值(方法:Thread.yield())
上下文切換示意圖:
上下文切換示意圖.png

三. java并發(fā)安全機(jī)制--保證多線程可見(jiàn)性
3.0 思維導(dǎo)圖

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()
