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