1.AQS工作流程&ReentrantLock实现原理
2022-03-04 09:53:15 0 举报
AQS工作流程&ReentrantLock实现原理;描述了AQS加锁流程和释放锁流程;以及AQS中等待队列和condition条件等待队列的模型
作者其他创作
大纲/内容
尾节点不为空
ConditionObjectheadWaitertailWaiter
Node2(thread2)等待被唤醒
parkAndCheckInterrupt调用LockSupport的park挂起当前线程.通过Thread.interrupted()返回是否中断
将是否中断过标识改为true
Node3(thread3)等待中...
Tail尾节点
不是第二个节点或者获取资源失败
以AQS为例
以ReentrantLock为例
定义了failed变量interrupted变量
tryAcquire获取资源由子类实现
next
获取head节点
Head头结点
通过LockSupport.unpark唤醒节点
获取队列tail
共享资源volatile int statevolatile确保可见性int实现共享模式和可重入语义
新建一个Node(thread)
获取失败
当前节点为第二个节点
自旋:等待或者获取锁成功返回
返回是否中断过在这里结束自旋
AQS加锁
prev
Waiter
unparkSuccessor唤醒第二个节点
Node1(thread1)持有锁的线程
自旋直到入队成功
AQS释放锁
公平模式
非公平模式
enq(node)整个完整入队流程都是自旋确保一定入队成功
释放锁成功
条件等待队列每个condition对应一个队列
尝试快速入队通过cas将当前节点修改为队列尾节点
如果第二个节点为已取消状态
addWaiter加入到等待队列中
volatileint state
tryAcquire(int)尝试获取资源
如果当前线程占有锁则state+1
shouldParkAfterFailedAcquire确保前继节点状态正常并修正前继节点状态为SIGNAL
从尾节点开始向前找到第一个节点状态正常(<=0)的节点
acquire
tryRelease释放资源由子类实现
获取资源成功
尾节点为空
虚节点使得\"每次唤醒头结点的下一个节点\"这个唤醒逻辑更加统一
完整入队成功
入队成功
独占模式
将前节点的状态改为SIGNAL因为后面需要前节点唤醒自己
将头结点状态改为0
通过condition.signal唤醒后加入到等待队列中
acquireQueued排队等待获取资源
快速入队成功
0 条评论
下一页