AQS(AbstractQueuedSynchronizer)是Java中的一个抽象类,位于java.util.concurrent.locks
包下,用于构建锁和同步器。它是实现大部分同步类(如Lock、Semaphore、ReentrantLock等)的基础。
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。通过重写这些方法,我们可以实现自定义的同步器逻辑。
ReentrantLock是Java中常用的可重入锁,它的底层实现就是基于AQS的。ReentrantLock通过继承AQS,并重写AQS的方法来实现锁的功能。具体来说,ReentrantLock重写了AQS的tryAcquire
和tryRelease
方法,实现了独占锁的获取和释放逻辑。
AQS的应用场景非常广泛,它可以用于构建各种类型的锁和同步器。常见的应用场景包括:
AQS是Java中一个重要的同步器框架,通过继承和重写AQS的方法,可以实现各种类型的锁和同步器,提供了线程的阻塞和唤醒机制,以及队列模型的支持。
Learn more:
本文作者:yowayimono
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!