视频字幕
AQS,全称AbstractQueuedSynchronizer,是Java并发包中用来构建锁和同步器的一个基础框架。它为许多并发类提供了底层支持,包括ReentrantLock、Semaphore、CountDownLatch等常用的同步工具。
AQS的核心由四个部分组成。首先是状态变量State,用整数表示同步状态。其次是FIFO等待队列,存放等待获取同步状态的线程节点。第三是获取和释放操作,定义了如何尝试获取和释放状态。最后是支持独占和共享两种同步模式。
状态变量State在不同同步器中有不同含义。在ReentrantLock中表示重入次数,在Semaphore中表示可用许可数,在CountDownLatch中表示计数值。AQS支持两种同步模式:独占模式只允许一个线程获取状态,如ReentrantLock;共享模式允许多个线程同时获取状态,如Semaphore。
AQS的工作流程如下:当线程调用acquire方法时,首先尝试获取同步状态。如果获取成功,线程继续执行;如果获取失败,线程会被封装成节点加入到FIFO等待队列中并被阻塞。当持有状态的线程释放状态时,会唤醒队列中的等待线程,被唤醒的线程重新尝试获取同步状态。
AQS的最大优势在于简化了同步器的开发。它提供了统一的队列管理机制,高效的线程阻塞和唤醒操作,支持公平和非公平策略,以及可中断的等待机制。通过AQS这个统一框架,Java并发包中的ReentrantLock、Semaphore、CountDownLatch、ReentrantReadWriteLock等同步工具都能够复用相同的底层实现,大大提高了开发效率和代码质量。