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