AQS(Abstract Queued Synchronizer,形象队列同步器)是 Java 中的一个并发编程工具类,用于实现自定义的同步器。AQS 提供了一种基于 FIFO 期待队列的机制,能够通过实现其形象办法,定义独占锁(如 ReentrantLock)或共享锁(如 CountDownLatch、Semaphore)等各种同步器。
AQS 通过定义了一个 State 变量来示意同步状态,同时保护了一个期待队列,当一个线程获取锁失败时,会将该线程退出到期待队列中,并将其阻塞,当锁的状态产生扭转时,AQS 会从期待队列中抉择一个线程唤醒,使其有机会获取锁。
在应用 AQS 时,须要继承 AbstractQueuedSynchronizer 类,并实现以下几个办法:
1)tryAcquire(int): 尝试获取锁的操作,返回 true 示意胜利获取锁,false 示意获取锁失败,须要进入期待队列。
2)tryRelease(int): 尝试开释锁的操作,返回 true 示意开释胜利,false 示意开释失败。
3)tryAcquireShared(int): 尝试获取共享锁的操作,返回值的含意与 tryAcquire(int) 雷同。
4)tryReleaseShared(int): 尝试开释共享锁的操作,返回值的含意与 tryRelease(int) 雷同。
5)isHeldExclusively(): 判断以后线程是否持有独占锁。
AQS 还提供了一些外部办法用于实现同步器的逻辑,如 enq(Node) 用于将节点退出期待队列,deq(Node) 用于将节点从期待队列中移除等等。
总的来说,AQS 是一个十分弱小和灵便的同步器工具类,能够用于实现各种各样的同步器,如独占锁、共享锁、读写锁、信号量、倒计时门闩等。
链接
一、AQS- 基本原理 17 问