背景介绍

AQS全称为Abstract Queue Synchronizer(抽象队列同步器)。AQS是一个同步器,J.U.C中的并发编程类都是基于AQS的。例如:ReentrantLock,Semaphore等。

重要类及变量分析

image.png
根据类图可以看出AbstractQueueSynchronizer类继承了AbstractOwnableSynchronizer类,同时依赖了其内部类Node(用于实现等待队列)

AbstractOwnableSynchronizer

exclusiveOwnerThread:加锁成功的线程对象

AbstractOwnableSynchronizer

state:锁状态,默认为0表示没有上锁,当一个线程加锁成功后会变为1,如果加锁的线程再次进入则会对state继续累加
head:等待队列的头节点
tail:等待队列的尾节点

Node

waitStatus:当前节点的等待状态
prev:后一个节点
next:前一个节点
thread:线程对象。加锁失败的线程对象
nextWaiter:下一个等待中的节点

实现原理

image.png

  1. 初始状态时AQS中的state为0,加锁线程为null
  2. 线程1和线程2以cas的形式更新state。线程1更新成功,此时加锁线程为线程1。线程2进入等待队列
  3. 当线程1执行完毕后,通知等待队列中的队首元素进行执行
  4. 如果此时线程1执行完毕,同时有线程3需要执行,那么如果是非公平锁,线程3与线程2并发更新state,如果是公平锁,线程3进入等待队列

    可重入性

    AQS是支持重入的,当线程1第一次将state更新成1后,当它第二次进入时会判断当前加锁线程为自己,则会对state继续加1。