并發(fā)包鎖結(jié)構(gòu)
Lock
Lock是一個(gè)接口,定義了鎖獲取和釋放的基本操作。
AbstractQueuedSynchronizer
隊(duì)列同步器,是用來構(gòu)建鎖或者其他同步組件的基礎(chǔ)框架,它使用了一個(gè)int成員變量表示同步狀態(tài),通過內(nèi)置的FIFO隊(duì)列來完成資源獲取線程的排隊(duì)工作。
同步器是實(shí)現(xiàn)鎖的關(guān)鍵,在鎖的實(shí)現(xiàn)中聚和同步器,利用同步器實(shí)現(xiàn)鎖的語義。鎖是面向使用者的,它定義了使用者與鎖交互的接口,隱藏了實(shí)現(xiàn)細(xì)節(jié);同步器面向的是鎖的實(shí)現(xiàn)者,它簡(jiǎn)化了鎖的實(shí)現(xiàn)方式,屏蔽了同步狀態(tài)管理、線程的排隊(duì)、等待與喚醒等底層操作。
隊(duì)列同步器方法
- 同步器同步狀態(tài)訪問和修改的方法
- 同步器可重寫的方法
- 同步器模板方法
同步隊(duì)列
節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)
節(jié)點(diǎn)是構(gòu)成同步隊(duì)列(等待隊(duì)列)的基礎(chǔ),同步器擁有首節(jié)點(diǎn)和尾節(jié)點(diǎn),沒有成功獲取同步狀態(tài)的線程將會(huì)成為節(jié)點(diǎn)加入到該隊(duì)列的尾部。
- 獨(dú)占式同步狀態(tài)獲取
主要完成同步狀態(tài)獲取、節(jié)點(diǎn)構(gòu)造、加入同步隊(duì)列、在同步隊(duì)列自旋。
- 獨(dú)占式同步狀態(tài)釋放
整個(gè)過程總結(jié):在獲取同步狀態(tài)時(shí),同步器維護(hù)一個(gè)同步隊(duì)列,獲取狀態(tài)失敗的線程都會(huì)被加入到隊(duì)列中并在隊(duì)列中進(jìn)行自旋;移出隊(duì)列(停止自旋)的條件是前驅(qū)節(jié)點(diǎn)為頭節(jié)點(diǎn)且成功獲取了同步狀態(tài)。在釋放同步狀態(tài)時(shí),同步器調(diào)用tryRelease方法釋放同步狀態(tài),然后喚醒頭節(jié)點(diǎn)的后繼節(jié)點(diǎn)。
ReentrantLock
- 可重入
- 公平不公平
參考
《Java 并發(fā)編程的藝術(shù)》