(AQS)ReentrantLock非公平锁执行过程
2020-11-10 15:14:57 0 举报
(AQS)ReentrantLock非公平锁执行过程
作者其他创作
大纲/内容
否
创建空结点对象作为哨兵结点(waitStatus为默认值0)
interrupted=trueorinterrupted=false
修改占用线程为当前线程,获取到锁资源,结束
前一个结点是否是头结点
执行线程代码
status=0?
false
将当前结点设为哨兵结点,将前一个哨兵结点引用全部移除,修改相关属性
为当前线程添加一个中断
再次检查能否将state从0改成1,以及判断是否是当前线程已占用锁资源且在代码块中重复加锁
执行unlock方法
结束
tryAcquire()
status自减
是
从尾结点开始,找到第一个符合条件的线程结点
释放该结点对应线程的阻塞状态
哨兵结点后一个结点waitStatus<=0?
再次检查能否将state从0改成1,以及判断是否是当前线程已也有锁资源且在代码块中重复加锁
shouldParkAfterFailedAcquire
将当前线程结点添加到队列中
CAS尝试将state从0设置为1
执行lock方法
interrupted=false
将头结点的waitStatus设置为0,修改相关属性
true
将线程唤醒
尾结点为空?
interrupted=true?
获取到锁资源,结束
将当前线程正式阻塞
0 条评论
下一页