0%

AQS漫谈

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