ReentrantLock公平锁的加锁过程源码程序图
2021-11-06 20:46:22 6 举报
ReentrantLock公平锁的加锁过程源码程序图
作者其他创作
大纲/内容
do while语句为该节点找一个能唤醒自己的前驱节点
判断刚进入队列的节点的前驱节点是否为head节点if (p == head)
N,0 -2 -3
进入该函数
c = getState()判断锁的状态
表示addWaiter()以结束,并返回该阻塞节点
同步队列是否有其他线程正在等待
成功
if(ws > 0)
CAS操作建立头节点,并使用尾结点指向它初始化队列
失败,被其他线程抢占先机
LockSupport.park(this);return Thread.interrupted();这里用了LockSupport.park(this)来挂起线程,然后就停在这里了,等待被唤醒
判断parkAndCheckInterrupt()
return false
n
enq(node)
addWaiter(Node.EXCLUSIVE)把当前向获取锁的线程包装成Node节点,并且加入队列
ws = -1该前驱节点可以唤醒后继节点
获取锁失败
y
不是
acquire(1)
ReentrantLock公平锁的实现
自旋入队
return false
争取锁成功setExclusiveOwnerThread(current);
把当前node节点加到链表最后面去,也就是阻塞队列的最后,通过CAS操作,防止多线程操作失误问题
Y,说明队列为空
N
判断尾结点是否null
入队return node
Y
c = 0表示没有线程持有锁
失败
没有
for(;;)死循环自旋
tryAcquire(1)尝试获取锁
判断(current == getExclusiveOwnerThread()
CAS改变所得状态
先调用addWaiter(Node mode)
CAS操作将前驱节点的ws设置成-1
失败了
accquireQueued()函数for(;;)死循环
tryAcquire(arg)
是
return ture
失败,重新来
有
判断前驱节点的waitStatus状态
状态值 + 1(可重入锁)
锁已经被某个线程持有
收藏
0 条评论
回复 删除
下一页