学习笔记(16):Java并发编程精讲-AQS的数据结构

立即学习:https://edu.****.net/course/play/26270/326876?utm_source=blogtoedu

一、什么是 AQS?

AQS:AbstractQueuedSynchronizer

提供一个框架来实现阻塞锁和相关的依赖于先进先出(FIFO)等待队列;

各种同步组件的核心抽象实现类;

多个请求时,管理等待队列,锁的占用和释放,中断、超时和通知等。

 

二、AQS 扮演的作用

学习笔记(16):Java并发编程精讲-AQS的数据结构

1. 可重入锁的公平非公平锁实现

2. 可重入锁读写锁的公平非公平锁实现

3. 信号量的公平非公平锁实现

4. 线程池工作线程 Worker

5. CountDownLatch 闭锁实现

 

三、 源码解析

AQS

学习笔记(16):Java并发编程精讲-AQS的数据结构

head

等待队列的头结点,初始值为 null,延迟初始化;除了初始化,后续只能通过setHead()方法来设置;如果head节点存在,它的waitStatus不能为 CANCELLED;

tair 

等待队列的尾节点,初始值为null,延迟初始化;只能通过添加新节点的enq()方法来更新tair节点。

state

int 值

0 表示AQS没有线程占用;

1 表示有线程占用锁,后续线程需要排队等待获取锁

>1 表示已占用锁的线程重入了锁,state可表示重入锁的次数;

 

exclusiveOwnerThread

获得独占锁的线程

 

AQS.Node

学习笔记(16):Java并发编程精讲-AQS的数据结构

waitStatus

0:初始状态

CANCELLED:节点是取消状态,等待超时或被中断

SIGNAL:后续节点处于等待状态,需要被唤醒

CONDITION:节点处于等待中

PROPAGATE:下一个需要被无条件传播

 

prev

前置节点,用于检查前节点的状态,若前节点为 null,则会在等待队列中取消前节点直到找到没取消的位置(head节点是不会被取消的)

next

等待队列的后一个节点

thread

当前节点加入等待队列的线程

nextWaiter

在Condition队列上等待的下一个节点