ReentrantLock公平锁流程分析
2021-11-16 17:51:35 0 举报
ReentrantLock公平锁流程分析
作者其他创作
大纲/内容
tail
1
setExclusiveOwnerThread
next
prev
unLock
exclusiveOwnerThread=null
重入次数减1
lock
cas设置当前节点waitStatus=0
可中断标记清除
thread=nullnextWaiter=nullwaitStatus=0
thread=thread1nextWaiter=nullwaitStatus=0
thread=nullnextWaiter=nullwaitStatus=-1
是
thread=thread2nextWaiter=nullwaitStatus=0
创建当前节点
thread0
并行抢锁
设置当前线程
cas创建head节点.确保首节点只被创建一次
acquire
setState=0
3
enq
LockSupport.unpark(s.thread)
tryAcquire
Thread.interrupted()
thread1
线程获取锁
非空
阻塞当前线程
获取当前节点的下个节点
取出头节点再尝试获取锁
入队子流程
state-1
node.next
acquireQueued
LockSupport.park
执行业务逻辑
当前节点的前驱节点指向tail
release
入队,阻塞
加锁
2
前驱节点的下一个节点执行tail
空
parkAndCheckInterrupt
nonfairTryAcquire
cas创建一个空节点
唤醒当前线程
2.addWaiter
释放锁
tail节点是否为空
入链表尾部
thread2
shouldParkAfterFailedAcquire
加锁次数是否为0
1.再次尝试抢占锁2.如果是当前线程state+1
设置当前节点为tail,compareAndSetTail
修改state=1
尾部节点
生成双向链表
unparkSuccessor
head
0 条评论
回复 删除
下一页