释放锁以及添加线程对于队列的变化
當(dāng)出現(xiàn)鎖競(jìng)爭(zhēng)以及釋放鎖的時(shí)候,AQS同步隊(duì)列中的節(jié)點(diǎn)會(huì)發(fā)生變化,首先看一下添加節(jié)點(diǎn)的場(chǎng)景。
里會(huì)涉及到兩個(gè)變化
1. 新的線程封裝成Node節(jié)點(diǎn)追加到同步隊(duì)列中,設(shè)置prev節(jié)點(diǎn)以及修改當(dāng)前節(jié)點(diǎn)的前置節(jié)點(diǎn)的next節(jié)點(diǎn)指向自己?
2. 通過CAS講tail重新指向新的尾部節(jié)點(diǎn)?head節(jié)點(diǎn)表示獲取鎖成功的節(jié)點(diǎn),當(dāng)頭結(jié)點(diǎn)在釋放同步狀態(tài)時(shí),會(huì)喚醒后繼節(jié)點(diǎn),如果后繼節(jié)點(diǎn)獲得鎖成功,會(huì)把自己設(shè)置為頭結(jié)點(diǎn),節(jié)點(diǎn)的變化過程如下
這個(gè)過程也是涉及到兩個(gè)變化
1. 修改head節(jié)點(diǎn)指向下一個(gè)獲得鎖的節(jié)點(diǎn)
2. 新的獲得鎖的節(jié)點(diǎn),將prev的指針指向null?
設(shè)置head節(jié)點(diǎn)不需要用CAS,原因是設(shè)置head節(jié)點(diǎn)是由獲得鎖的線程來完成的,而同步鎖只能由一個(gè)線程獲得,所以不需要CAS保證,只需要把head節(jié)點(diǎn)設(shè)置為原首節(jié)點(diǎn)的后繼節(jié)點(diǎn),并且斷開原h(huán)ead節(jié)點(diǎn)的next引用即可?
?
總結(jié)
以上是生活随笔為你收集整理的释放锁以及添加线程对于队列的变化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AQS 的内部实现
- 下一篇: R eentrantLock的源码分析