编辑
2023-11-07
后端
00
请注意,本文编写于 549 天前,最后修改于 549 天前,其中某些信息可能已经过时。

目录

AQS的原理和作用
AQS的使用方式
AQS与ReentrantLock的关联
AQS的应用场景

AQS(AbstractQueuedSynchronizer)是Java中的一个抽象类,位于java.util.concurrent.locks包下,用于构建锁和同步器。它是实现大部分同步类(如Lock、Semaphore、ReentrantLock等)的基础。

AQS的原理和作用

AQS提供了一种简单的框架,用于原子式管理同步状态、阻塞和唤醒线程的功能,以及队列模型。它的核心思想是,如果请求的共享资源空闲,就将当前请求资源的线程设置为有效的工作线程,并将共享资源设置为锁定状态;如果共享资源被占用,就需要一定的阻塞等待唤醒机制来保证线程的有序访问。

AQS的主要作用有:

  • 提供了独占锁和共享锁的实现机制,可以用于构建各种类型的锁。
  • 提供了阻塞和唤醒线程的功能,可以实现线程的等待和通知机制。
  • 提供了队列模型,可以按照一定的规则管理等待获取锁的线程。

AQS的使用方式

AQS的使用方式主要通过继承和重写AQS的方法来实现。一般情况下,我们会自定义一个同步器类,继承AQS,并重写以下方法:

  • tryAcquire(int arg):尝试获取锁,如果成功则返回true,否则返回false。
  • tryRelease(int arg):尝试释放锁,如果成功则返回true,否则返回false。
  • tryAcquireShared(int arg):尝试获取共享锁,如果成功则返回大于等于0的值,否则返回小于0的值。
  • tryReleaseShared(int arg):尝试释放共享锁,如果成功则返回true,否则返回false。

通过重写这些方法,我们可以实现自定义的同步器逻辑。

AQS与ReentrantLock的关联

ReentrantLock是Java中常用的可重入锁,它的底层实现就是基于AQS的。ReentrantLock通过继承AQS,并重写AQS的方法来实现锁的功能。具体来说,ReentrantLock重写了AQS的tryAcquiretryRelease方法,实现了独占锁的获取和释放逻辑。

AQS的应用场景

AQS的应用场景非常广泛,它可以用于构建各种类型的锁和同步器。常见的应用场景包括:

  • ReentrantLock:可重入锁,支持公平锁和非公平锁。
  • Semaphore:信号量,用于控制同时访问某个资源的线程数。
  • CountDownLatch:倒计时门闩,用于等待一组线程执行完毕再继续执行。
  • CyclicBarrier:循环屏障,用于等待一组线程达到某个状态再继续执行。
  • Condition:条件变量,用于线程间的等待和通知机制。

AQS是Java中一个重要的同步器框架,通过继承和重写AQS的方法,可以实现各种类型的锁和同步器,提供了线程的阻塞和唤醒机制,以及队列模型的支持。


Learn more:

  1. AQS 详解| JavaGuide(Java面试+ 学习指南)
  2. 从ReentrantLock的实现看AQS的原理及应用 - 美团技术团队
  3. 你来讲讲AQS是什么吧?都是怎么用的? - 纪莫 - 博客园
  4. 什么是AQS
  5. 面试逼问

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!