AQS源码解析
AQS源码解析
ShioAQS
源码解析
AQS
是Java里的一个同步工具类
,全称为AbstractQueuedSynchronizer
。它是JUC
包中中实现锁和同步机制的基础。
它可以被认为是一种框架或模板,用于实现多种同步器,比如ReentrantLock
、CountDownLatch
、Semaphore
、ReentrantReadWriteLock
等。
作为本系列第一节, 我们先了解这些同步工具的共同的祖先(虽然实际上是聚合关系) —-AQS
在了解AQS
之前, 我们要知道:
AQS
本质上是一个队列,它是将等待锁或资源的线程排队,并在锁或资源可用时将其唤醒。
建立在这个基础上, 方便理解后序讲解
我们以平常最常用的ReentrantLock
为例
ReentrantLock lock= new ReentrantLock(); |
我们点进lock()
方法, 会发现调用的是sync.lock();
public void lock() { |
sync
是什么呢? 这其实是ReentrantLock
一个内部类Sync
的实例
Sync:是提供AQS
实现的工具,类似于适配器,提供了抽象的lock(),便于快速创建非公平锁。
而Sync
继承自AQS(AbstractQueuedSynchronizer)
, 事实上, 上述几乎每个同步工具都又一个Sync
的实现子类, 而且均继承自AQS
, 这下就明白为什么说 AQS
是一种框架或模板, 如果你想定义一个同步工具, 也完全可以通过继承AQS
这个抽象类来实现, 文末我们会给出一个通过AQS
简单自定义的互斥锁
而这个内部类也引出了我们本篇讲解的重点 AQS
这是
import java.util.concurrent.locks.AbstractQueuedSynchronizer; |
这是一个使用内部类和 AQS
实现的互斥锁(Mutex
)类。
tryAcquire
:尝试获取资源。如果当前状态为0(未锁定),那么设置为1(锁定),并设 置当前线程为独占资源的线程。tryRelease
:尝试释放资源。设置状态为0并清除持有资源的线程。isHeldExclusively
:判断当前资源是否被独占。
评论
匿名评论隐私政策