Java中的AbstractQueuedSynchronizer
(AQS)是Java并发框架的核心组件之一,它位于java.util.concurrent.locks
包下。AQS为Java的锁和其他同步工具提供了基础架构,它使用模板设计模式和一种称为“CLH锁”的算法来实现高效的线程同步。
AQS的主要组成部分
AQS的主要功能围绕着一个volatile整型成员变量state
和一个FIFO线程等待队列来组织。state
变量用于表示同步状态,比如锁是否被持有,有多少线程正在持有锁等。这个状态变量是通过原子更新的方式来保证线程安全性。
CLH锁算法
AQS使用CLH锁算法(Craig, Landin, and Hagersten)来管理线程间的同步。CLH锁算法的特点是使用了一个尾指针(tail pointer)来标识队列的末端,新来的线程会将其自身添加到队列的尾部,并且将自己设置为队列的新的尾节点。当线程从等待队列中被唤醒时,它会检查前一个节点的状态,以确定是否可以尝试获取锁。
AQS的关键方法
AQS提供了一些关键的方法,它们被子类重写以适应特定的同步需求:
isHeldExclusively()
:判断当前同步状态是否是独占模式。tryAcquire(int)
和tryRelease(int)
:尝试获取和释放同步状态,这两个方法由子类实现,用于具体的操作。tryAcquireShared(int)
和tryReleaseShared(int)
:尝试获取和释放共享模式下的同步状态。acquire(int)
和acquireShared(int)
:如果无法立即获取同步状态,这些方法会将当前线程放入等待队列并阻塞当前线程。<