AbstractQueueSynchronizer学习
2019-03-05 20:01:20 0 举报
AQS的简单理解
作者其他创作
大纲/内容
使得最近一个非CANCELLED节点作为前驱节点
是
tryRelease(int arg)
是否线程有过中断
前驱节点状态
开始
结束
unpark下一个等待线程 LockSupport.unpark(Thread);
中断当前线程
重置头节点
SIGNAL
LOCK
UNLOCK
否
是否已释放独占锁
addWaiter(Node node)(标识该节点为独占锁节点)1.维护一个双向链表,存放了头节点与尾节点2.添加第一个节点的时候会先创建一个头节点并把需要添加的节点的前驱节点设置头节点,尾节点指向自己3.之后添加节点的时候只需将自身成为尾节点就行
CANCELLE
其它状态
新增节点的前驱节点是否是头节点
Node2
tryAcquire(int arg)
Head
parkAndCheckInterrupt()1.执行LockSupport.park(this);阻塞线程,直到调用 LockSupport.unpark(Thread);(如果给定线程的许可尚不可用,则使其可用。如果线程在 park 上受阻塞,则它将解除其阻塞状态。否则,保证下一次调用 park 不会受阻塞。如果给定线程尚未启动,则无法保证此操作有任何效果。)2.执行完后返回当前线程中断状态
是否得到独占锁
头节点表示正在处理的线程
否
Loop
Opt
Head是否不为空且状态不为0
设置前驱节点状态为SIGNAL
0 条评论
下一页