AQS原理
2023-05-25 15:11:25 8 举报
AQS底层原理,实现流程
作者其他创作
大纲/内容
是
head
1.一开始AQS队列没有尾结点,需要先创建一个虚拟节点;2.新的线程封装成Node节点追加到同步队列,设置prev节点以及修改当前节点的前置节点的next指向自己;3.通过cas将tail重新指向新的尾部节点
next
退出返回
acquireQueue()
3
成功
2
thread-0 thread-2
1.将当前节点状态设置为SIGNAL2.park方法阻塞当前线程
prev
null
3.1
2.1
当前节点的前驱节点是否为头结点
当前节点设置为头结点
AQS
thread-2
失败
释放锁节点移除节点
thread-1
获取同步状态是否成功
不是
tail
初始化完成
thread-0
1.head节点表示获取锁成功的节点;当头结点在释放同步状态时,会唤醒后续节点;如果后续节点获取锁成功,会把自己设置成头结点;2.修改head节点,指向下一个获得锁的节点3.新获得锁的节点,设置他的prev节点为null
acquire方法
4
enq方法
首次插入失败,再调用enq()再次插入
acquireQueued方法
直接将当前节点CAS尾插到同步队列
未初始化
新建头结点,头指针,尾指针都指向该节点
1
thread-2抢先创建了尾结点
获取同步状态
节点插入成功
2.2
将当前线程封装为Node
失败自旋
2.封装新的线程为Node节点
流程图
虚拟尾结点
同步队列是否已经初始化(判断尾结点是否为null)
线程2
线程被中断或者前驱节点被释放
同步队列队尾节点是否为null
addWaiter()-----添加新节点(现实状态)
1.创建虚拟节点(尾结点)
addWaiter()-----添加新节点(理想状态)
线程1
addWaiter方法
将当前节点CAS尾插入同步队列是否成功
thread-2null
0 条评论
回复 删除
下一页