ReentrantLock源码分析
2022-06-11 13:49:56 0 举报
ReentrantLock源码分析,AQS,AbstractQueuedSynchronizer同步器
作者其他创作
大纲/内容
不为null
线程Node成功入队后能否获取到锁
state -1 = 0 ?
队列
cas直接将当前线程Node添加到队尾
这里for循环自旋不断获取头节点,判断头节点是否能获取到锁,直到获取锁才退出
是
公平锁
非公平锁
cas修改state成功
不等于0
为null
抛异常
cas成功?
失败
state = 0 ?
持有锁线程是否等于本线程
tail
加锁成功
head
当前队列尾结点是否null,也就是队列为空
开始入队
解锁
成功
prev
入队成功
当前线程park
false
不成功
否
初始化队列,构造一个线程为空的Node对象,作为队列的头尾节点
cas修改state
tryRelease尝试释放资源
自旋入队
在非公平情况下,有可能state被其他线程提前修改了
Nodethread = thread1nextWaiter = nullwaitStatus = 0
是否成功
head节点是否不为null且waitStatus不为0
设置state
等于0
不是
持有锁的线程是本线程?
找到后继节点并唤醒
如果当前线程Node是队列的第一个节点(头节点后面一个节点)
线程加锁时,但队列已经有线程在排队,所以当前线程需要park
Nodethread = nullnextWaiter = nullwaitStatus = -1
本线程Node需要修改前一个Node的waitStatus为-1(表示-1这个Node释放锁后需要唤醒后面一个Node)
设置setExclusiveOwnerThread = null
公平锁没有一开始尝试获取锁
next
cas是否成功?加锁是否成功?
直接CAS修改state
0 条评论
回复 删除
下一页