AQS
2021-07-06 14:42:10 0 举报
AQS理解
作者其他创作
大纲/内容
parkAndCheckInterrupt
找到下一个需要唤醒的结点
唤醒
acquire
当前结点更新为head
作用:LockSupport.park阻塞,休息
自旋获取资源
CANCELLED(1)
SIGNAL(-1)
nonfairTryAcquire
release
释放掉资源后,唤醒后继
创建新的结点,并设为独占模式,加入队列的尾部(CAS自旋)
大致流程图
acquireQueued
addWaiter
作用:1、过滤放弃的线程2、设置前驱状态为SIGNAL
waitStatus状态
2
结点在Condition等待队列上,当其他线程调用signal后,会从等待队列移动到同步队列中,等待获取锁
3
当前结点已取消,等待gc
tryAcquire
后继结点在等待当前结点唤醒。后继结点入队时,会将前继结点的状态更新为SIGNAL
负值表示结点处于有效等待状态,而正值表示结点已被取消
PROPAGATE(-3)
共享模式下,前继结点不仅唤醒后继结点,同时也可能唤醒后继的后继
阻塞
shouldParkAfterFailedAcquire
1
获取到资源
ReentrantLock非公平锁为例
state由volatile修饰
释放资源
0
CONDITION(-2)
这也是独占模式
共享锁和独占锁区别:共享锁获取资源的线程还可以唤醒后继的结点
tryRelease
LockSupport.unpark(s.thread);
没获取到
唤醒条件1)被unpark();2)被interrupt()
新结点默认状态
0 条评论
下一页