学习笔记(16):Java并发编程精讲-AQS的数据结构
立即学习:https://edu.****.net/course/play/26270/326876?utm_source=blogtoedu
一、什么是 AQS?
AQS:AbstractQueuedSynchronizer
提供一个框架来实现阻塞锁和相关的依赖于先进先出(FIFO)等待队列;
各种同步组件的核心抽象实现类;
多个请求时,管理等待队列,锁的占用和释放,中断、超时和通知等。
二、AQS 扮演的作用
1. 可重入锁的公平非公平锁实现
2. 可重入锁读写锁的公平非公平锁实现
3. 信号量的公平非公平锁实现
4. 线程池工作线程 Worker
5. CountDownLatch 闭锁实现
三、 源码解析
AQS
head
等待队列的头结点,初始值为 null,延迟初始化;除了初始化,后续只能通过setHead()方法来设置;如果head节点存在,它的waitStatus不能为 CANCELLED;
tair
等待队列的尾节点,初始值为null,延迟初始化;只能通过添加新节点的enq()方法来更新tair节点。
state
int 值
0 表示AQS没有线程占用;
1 表示有线程占用锁,后续线程需要排队等待获取锁
>1 表示已占用锁的线程重入了锁,state可表示重入锁的次数;
exclusiveOwnerThread
获得独占锁的线程
AQS.Node
waitStatus
0:初始状态
CANCELLED:节点是取消状态,等待超时或被中断
SIGNAL:后续节点处于等待状态,需要被唤醒
CONDITION:节点处于等待中
PROPAGATE:下一个需要被无条件传播
prev
前置节点,用于检查前节点的状态,若前节点为 null,则会在等待队列中取消前节点直到找到没取消的位置(head节点是不会被取消的)
next
等待队列的后一个节点
thread
当前节点加入等待队列的线程
nextWaiter
在Condition队列上等待的下一个节点