第一章 并發(fā)編程的挑戰(zhàn)
-
上下文切換
- 時(shí)間片切換會(huì)導(dǎo)致速度降低
- 使用Lmbench3可以測(cè)試上下文切換的時(shí)長(zhǎng),使用vmstat可以測(cè)試上下文切換的次數(shù)
- 減少上下文切換:無(wú)鎖并發(fā)編程、CAS算法(atomic原子類)、使用最少線程和協(xié)程(在單個(gè)線程里,完成多個(gè)任務(wù)的調(diào)度和切換)
-
死鎖
- 避免一個(gè)線程同時(shí)拿多個(gè)鎖或者多個(gè)資源
- 使用定時(shí)鎖,lock.trylock(timeout)
- 數(shù)據(jù)庫(kù)鏈接,加鎖和解鎖必須在同一個(gè)鏈接里面,否則會(huì)造成解鎖失敗
-
資源限制
- 受限于硬件資源或者軟件資源,如cpu、帶寬、數(shù)據(jù)庫(kù)連接數(shù)等
- 分布式處理,使用鏈接池
第二章 java并發(fā)機(jī)制的底層實(shí)現(xiàn)原理
-
volatile的應(yīng)用
java編程語(yǔ)言允許線程訪問(wèn)共享變量,為了確保共享變量能被準(zhǔn)確和一致的更新,線程應(yīng)該通過(guò)排它鎖單獨(dú)獲得這個(gè)變量。
-
cpu術(shù)語(yǔ)cpu術(shù)語(yǔ)
-
編譯成字節(jié)碼,volatile修飾的變量會(huì)多一行LOCK指令。
- 將當(dāng)前緩層行的數(shù)據(jù)寫到主內(nèi)存中
- 這個(gè)寫回內(nèi)存的操作會(huì)使得其他CPU中緩存了該內(nèi)存地址的數(shù)據(jù)無(wú)效
-
synchronized的實(shí)現(xiàn)原理
-
基本使用
- 鎖同步方法,鎖是當(dāng)前實(shí)例對(duì)象
- 鎖靜態(tài)方法,鎖是當(dāng)前類的Class對(duì)象
- 鎖代碼塊,鎖是括號(hào)里面的對(duì)象
-
實(shí)現(xiàn)原理
- jvm基于使用進(jìn)入和退出monitor對(duì)象來(lái)實(shí)現(xiàn)方法同步和代碼塊同步
- 鎖代碼塊基于monitorenter和monitorexit指令實(shí)現(xiàn),所方法塊實(shí)現(xiàn)細(xì)節(jié)不同,但也可以基于這兩個(gè)指令
- 編譯后,monitorenter插入到代碼塊的開(kāi)始位置,monitorexit插入到結(jié)束位置和異常位置
- jvm保證每個(gè)monitorenter有一個(gè)monitorexit與之對(duì)應(yīng)
- 任何一個(gè)對(duì)象,都有一個(gè)monitor對(duì)象與之關(guān)聯(lián),當(dāng)且一個(gè)monitor對(duì)象被持有后,它將處于鎖定狀態(tài)
- 線程執(zhí)行到monitorenter指令時(shí),會(huì)嘗試獲得對(duì)應(yīng)monitor的所有權(quán),即獲得對(duì)象的鎖
-
對(duì)象頭
-
synchronized使用的鎖是存在java對(duì)象頭中。對(duì)象是數(shù)組類型,則使用3個(gè)字寬;其他則使用2個(gè)字寬。在32位虛擬機(jī)中,1個(gè)字寬對(duì)應(yīng)4個(gè)字節(jié),即32bit對(duì)象頭長(zhǎng)度
-
Mark Word 里面默認(rèn)存儲(chǔ)的是對(duì)象的Hashcode,分代年齡,鎖標(biāo)記位;32位JVM默認(rèn)結(jié)構(gòu)如下默認(rèn)結(jié)構(gòu)
-
運(yùn)行期間,會(huì)因?yàn)殒i標(biāo)記位的變化而變化 運(yùn)行時(shí)結(jié)構(gòu)變化
-
64位虛擬機(jī)下,Mark Word是64bit大小,結(jié)構(gòu)如下64位結(jié)構(gòu)
-
synchronized使用的鎖是存在java對(duì)象頭中。對(duì)象是數(shù)組類型,則使用3個(gè)字寬;其他則使用2個(gè)字寬。在32位虛擬機(jī)中,1個(gè)字寬對(duì)應(yīng)4個(gè)字節(jié),即32bit
-




