ReentrantLock
2023-03-03 00:47:07 0 举报
ReentrantLock
作者其他创作
大纲/内容
head = node;node.thread = null;node.prev = null;
node -> 等待队列最后
获取锁失败
for循环
成功
sync.acquire(1);
cas尝试获取锁
拥有锁的线程 = 当前线程?
是
上一个节点的waitStatus?
-1
否
ReentrantLock
lock.lock();
将上一个节点的waitStatus设置为-1
是否被中断
AQS 定义了5个队列中节点状态:1. 值为0,初始化状态,表示当前节点在sync队列中,等待着获取锁。2. CANCELLED,值为1,表示当前的线程被取消;3. SIGNAL,值为-1,表示当前节点的后继节点包含的线程需要运行,也就是unpark;4. CONDITION,值为-2,表示当前节点在等待condition,也就是在condition队列中;5. PROPAGATE,值为-3,表示当前场景下后续的acquireShared能够得以执行;
遍历删除取消状态的节点
state + 1
1
设置当前节点为头节点
继续for循环
0
线程中断
尝试cas获取锁
获取锁成功
stete = 0?
标记当前线程为锁的拥有者
上一个节点是头结点?
LockSupport.park(this);
收藏
0 条评论
下一页