AQS 的全称为(AbstractQueuedSynchronizer),这个类在java.util.concurrent.locks包下面。
AQS 是一个用来构建锁和同步器的框架
6.2. AQS 原理分析
6.2.1. AQS 原理概览
AQS 使用一个 int 成员变量来表示同步状态, getState,setState,compareAndSetState 进行操作
6.2.2. AQS 对资源的共享方式
AQS 定义两种资源共享方式
- Exclusive(独占):只有一个线程能执行,如 ReentrantLock。又可分为公平锁和非公平锁
Share(共享):多个线程可同时执行,如CountDownLatch、Semaphore、 CyclicBarrier、ReadWriteLock
6.2.3. AQS 底层使用了模板方法模式
使用者继承 AbstractQueuedSynchronizer 并重写指定的方法。
- 将 AQS 组合在自定义同步组件的实现中,并调用其模板方法,而这些模板方法会调用使用者重写的方法。
isHeldExclusively()//该线程是否正在独占资源。只有用到condition才需要去实现它。
tryAcquire(int)//独占方式。尝试获取资源,成功则返回true,失败则返回false。
tryRelease(int)//独占方式。尝试释放资源,成功则返回true,失败则返回false。
tryAcquireShared(int)//共享方式。尝试获取资源。负数表示失败;0表示成功,但没有剩余可用资源;正数表示成功,且有剩余资源。
tryReleaseShared(int)//共享方式。尝试释放资源,成功则返回true,失败则返回false。
6.3. AQS 组件总结
Semaphore(信号量)-允许多个线程同时访问
CountDownLatch(倒计时器)
CyclicBarrier(循环栅栏)6.4. 用过 CountDownLatch 么?什么场景下用的?
我们要读取处理 6 个文件,这 6 个任务都是没有执行顺序依赖的任务,但是我们需要返回给用户的时候将这几个文件的处理的结果进行统计整理。