释放锁以及添加线程对于队列的变化
生活随笔
收集整理的這篇文章主要介紹了
释放锁以及添加线程对于队列的变化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
當出現鎖競爭以及釋放鎖的時候,AQS同步隊列中的節點會發生變化,首先看一下添加節點的場景。
里會涉及到兩個變化
1. 新的線程封裝成Node節點追加到同步隊列中,設置prev節點以及修改當前節點的前置節點的next節點指向自己?
2. 通過CAS講tail重新指向新的尾部節點?head節點表示獲取鎖成功的節點,當頭結點在釋放同步狀態時,會喚醒后繼節點,如果后繼節點獲得鎖成功,會把自己設置為頭結點,節點的變化過程如下
這個過程也是涉及到兩個變化
1. 修改head節點指向下一個獲得鎖的節點
2. 新的獲得鎖的節點,將prev的指針指向null?
設置head節點不需要用CAS,原因是設置head節點是由獲得鎖的線程來完成的,而同步鎖只能由一個線程獲得,所以不需要CAS保證,只需要把head節點設置為原首節點的后繼節點,并且斷開原head節點的next引用即可?
?
總結
以上是生活随笔為你收集整理的释放锁以及添加线程对于队列的变化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AQS 的内部实现
- 下一篇: R eentrantLock的源码分析