lock()非公平
2021-12-13 04:16:11 0 举报
重入锁 非公平锁加锁流程
作者其他创作
大纲/内容
可以被阻塞,获得中断标记
自旋
该节点的前驱节点waitStatus==0
enq()
exclusiveOwnerThread = thread;
队列是否初始化
获取失败
将当前节点设置为头节点
NonfairSync
tryAcquire(1)(尝试去获取锁)
如果state!=0&&当前线程不是独占线程
tryAcquire()(尝试去获取锁)
判断前驱节点P是否为头节点
插入成功
如果state!=0&&当前线程为独占线程
创建一个空Node,队列的头指针和尾指针都指向该节点
state!=0未抢占到锁
是
lock()加锁
当前节点通过CAS操作插入到队列尾部
如果尾节点tail ==null
acquireQueued()
将当前线程封装成Node
否
删除该节点,获得Next
park()
该节点的前驱节点waitStatus>0
state==0抢占到锁修改state=1
acquire(1)
该节点的前驱节点waitStatus==-1
addWaiter()
获得Node节点的前驱节点
获取成功
判断该节点是否可以被阻塞
如果state==0
state=state+1
shouldParkAfterFailedAcquire()
CAS判断state是否为0
添加到队列中的尾节点
插入失败,重试
通过CAS操作修改该节点的前驱节点waitStatus==-1
如果尾节点tail !=null
退出返回
0 条评论
回复 删除
下一页