ReentrantLock公平锁加锁
2021-06-24 17:10:54 1 举报
ReentrantLock公平锁加锁流程
作者其他创作
大纲/内容
如果当前线程Node是队列的第一个线程Node?
在非公平锁的情况下,有可能state被其他线程提前改了
cas成功?
不等于0
线程加锁时,但队列中已经有线程在排队了,当前线程就可能会park
head
当前线程park
持有锁的线程是本线程?
cas修改state成功?
next
队列中存在线程Node?
失败
tail
开始入队
入队成功
成功
加锁成功
不是
存在
为NULL
不为NULL
队列
初始化队列,构造一个线程为空的Node对象,作为队列的头尾节点
是
NodeThread=线程对象waitStatus=0
自旋入队
不成功
state=0?
公平锁加锁
cas直接将当前线程Node添加到队尾
等于0
NodeThread=nullwaitStatus=0
线程Node入队之后能否获取到锁?
prev
不存在
当前队列尾节点是否为NULL,也就是队列是否为空?
本线程Node需要修改前一个Node的waitStatus为-1,表示前一个节点释放锁后要unpark本线程Node
0 条评论
下一页