ReentrantLock之CLH队列入队流程
2022-11-28 19:28:30 1 举报
ReentrantLock之公平锁入队流程
作者其他创作
大纲/内容
初始状态:head 和 tail 都为null
exclusiveOwnerThread = T0
next
Step4:经过第一次自旋之后,tail和head均指向新new的空Node节点
prev
Step5:第二次自旋之后,T1的prev节点指向临时Node临时Node的next指向T1
waitStatus = 0
当前独占线程T1
head = null
对应代码
thread = null
执行addWaiter之后,返回Node节点
addWaiter
thread = T2
执行lock()方法之后,假设是公平锁
Step3:开始第一次自旋
Step2:tryAcquire(arg)尝试加锁,T0为首个节点因为没有竞争,所以肯定成功,若T1线程同时竞争锁,T1加锁失败,开始入队
Step1:假设队列中没有对象,state置为1,并设置独占线程为T0
Step6:如果空节点 p 是首个节点,则尝试获取锁获取到锁,则把head指向T1,next指向null,prev指向null若不是首节点,则入队阻塞原先的空节点 p 在下次GC的时候被回收掉
Step7:线程T2竞争锁失败,开始入队,重复T1入队的操作
state = 1
thread = T1
T0入队
tail = null
初始化一个空的Node节点,dog李设计,减少后续实体空值判断逻辑
private void setHead(Node node) { head = node; node.thread = null; node.prev = null; }
T1入队
0 条评论
下一页