天天看点

AQS之基础分析

文章目录

  • ​​1.简介​​
  • ​​2.内部类Node​​
  • ​​3.AbstractQueuedSynchronizer​​
  • ​​4.AQS 内部体系架构​​
  • ​​5.AQS 子类​​

1.简介

抽象队列同步器,是一系列同步实现的模板类,如锁Lock,信号量Semaphore,倒排计数器CoundDownLatch等都是基于AQS实现的,同时还提供了Condition对象,其await和sign、signAll对象可以用于代替Object的wait和notofy、notifyAll方法。

CLH队列是是一种先进先出FIFO的双向队列,AQS对其实现微调,但原理不变,用于实现同步阻塞。

AQS中实际上包括两个队列,同步队列用于排斥锁和共享锁,条件队列用于Condition对象的等待和唤醒。

2.内部类Node

用于定义CLH队列中的节点

volatile int waitStatus;
volatile Node prev;
volatile Node next;
volatile Thread thread;
Node nextWaiter;      
AQS之基础分析
  1. 同步队列的前驱节点和后继节点 prev && next
  2. 节点中的线程 thread
  3. 节点状态 waitStatus

    CANCELlED: 1 等待超时或者线程被中断而取消

    SIGNAL: -1 后续节点被阻塞,也有可能是即将被阻塞(节点阻塞前将前驱节点状态置为SIGNAL)

    CONDITION: -2 用于条件队列

    PROPAGATE:-3 用于共享锁,在释放共享锁发挥作用

  4. 条件队列的下一个节点 nextWaiter

    主要用于条件队列。由于条件队列是建立在排斥锁的前提下的,也可以用来检查和表示锁的模式,当且仅当该字段为空节点(New Node())时代表共享模式。

3.AbstractQueuedSynchronizer

static final class Node {}
//头节点,指向队列中第一个节点。实际使用过程中要么是初始化的节点,要么代表最后一个获取资源成功的节点
private transient volatile Node head;
//尾节点,指向队列中最后一个节点
private transient volatile Node tail;
//状态,实际使用中可以表示资源数或者获取资源成功的线程、锁重入次数等等
private volatile int state;      
AQS之基础分析
AQS之基础分析

4.AQS 内部体系架构

AQS之基础分析
  • FairSync: 公平锁
  • NoFairSync: 非公平锁

5.AQS 子类

  1. Semphore: 共享锁案例
  2. ReentrantLock: 排他锁案例
  3. ReentrantReadWriteLock: 共享锁和排它锁案例
  4. ThreadPoolExecutor
  5. CountDownLatch: 共享锁案例