AQS
2021-10-24 14:15:50 0 举报
AQS
作者其他创作
大纲/内容
返回
添加一个节点(此前队列没头没尾)
lock.lock();
false
state减完了
doAcquireSharedInterruptibly
如果是线程重入了
自旋CAS地尝试state--,除非成功或state=0
cancelAcquire
acqireQueued
tryAcquiredShared
addWaiter
yes
设置头节点为当前节点,之前的head后节点变为null帮助GC
挂起
唤醒
cdl = new CountDownLatch(100)
自旋尝试入队
头节点不为空且头节点状态值不为0
fail
是否需要挂起(shouldParkAfterFailedAcquire)?
fair
lock = new Lock();
state=0
state减去释放次数,如果state=0则释放锁,否则不释放
被唤醒
cdl.countDown()
AQS:aquire
tryReleaseShared(1)
CDL
尝试获取锁tryAcquireShared
state没减完
被唤醒后
那么把取消的都删掉,直到找到最前面没有取消的节点
lock.unlock();
acquire尝试获取锁
state=0,并且在AQS队列中前面没有节点,并CAS修改state值成功
sync.releaseShared(1)
no
CAS设置当前节点status为signal
ReentrantLock
挂起当前线程
循环入队
state=0,并CAS修改state值成功
尝试快速入队
nonFair
cdl.await()
尝试获取锁
sync.setState(100)
state还没减完
从末尾找到头节点下一个节点的线程进行唤醒
CAS地设置当前节点为头节点,且状态为propegate
前置节点取消?
tryAcquire尝试获取锁
锁已释放
挂起等唤醒
tryRelease
如果前节点是头节点
循环
发生错误,且获取锁失败
AQS.release
当前线程的前节点还是signal
根据state状态判断:
0 条评论
下一页