AbstractQueuedSynchronizer
AQS是JDK提供的同步器抽象类,主要用于实现各种用途的锁(信号量,闭锁,可重入读写锁),本文主要记录AQS组成结构和核心能力分析。
结构分析
成员变量
- head:Node //同步队列头节点
- tail:Node //同步队列尾节点
- state:int //当前同步状态
- unsafe:Unsafe.getUnsafe()
- stateOffset:long
- headOffset:long
- tailOffset:long
- waitStatusOffset:long
- nextOffset:long
方法(Protected)
- getState():int //获取同步状态
- setState():int //设置同步状态
- compareAndSetState(int, int):int //使用CAS设置同步状态
- tryAcquire(int):boolean //尝试获取独占锁,实现时应先查看当前对象是否支持独占锁。
- tryRelease(int):boolean //尝试释放独占锁
- tryAcquireShared(int):boolean //尝试获取共享锁
- tryReleaseShared(int):boolean //尝试释放共享锁
- isHeldExclusively():boolean //当前线程是否获得了独占锁
方法(Public)
- acquire(int):void //获取独占锁(不响应中断)
- acquireInterruptibly(int):void //获取独占锁(响应中断)
- tryAcquireNanos(int, long):boolean //获取独占锁(不响应中断),若等待超时则失败
- release(int):boolean //释放独占锁,可以用来实现Lock.unlock()
- acquireShared(int):void //获取独占锁(不响应中断)
- acquireSharedInterruptibly(int):void //获取独占锁(响应中断)
- tryAcquireSharedNanos(int, long):boolean //获取共享锁(不响应中断),若等待超时则失败
- releaseShared(int):boolean //释放共享锁
- hasQueuedThreads(int):boolean //同步队列中是否有线程在等待
- hasContended():boolean //查询是否其他线程也曾竞争该同步器;即是否有线程已经阻塞。
- getFirstQueuedThread():Thread //获取第一个进入同步队列的线程(等待时间最长的)。
- isQueued(Thread):boolean //线程是否在同步队列中
- hasQueuedPredecessors():boolean //判断当前线程是否有前导节点,即判断当前线程是否在同步队列的队首,来返回同步队列是否有比当前线程等待更久的线程。
- getQueueLength():int //返回同步队列的预估长度
- getQueuedThreads():Collection
//获取同步队列中的线程集合 - getExclusiveQueuedThreads():Collection
//获取同步队列中,等待获取独占锁的线程集合 - getSharedQueuedThreads():Collection
//获取同步队列中,等待获取共享锁的线程集合 - owns(ConditionObject):boolean //判断当前同步器是否使用了给定condition
- hasWaiters(ConditionObject):boolean //判断是否有线程在给定condition等待
- getWaitQueueLength(ConditionObject):int //返回在给定condition上等待的线程估计数量
- getWaitingThreads(ConditionObject):Collection
//返回在给定condition上等待的线程集合。 - toString():String