Java并发编程系列-AbstractQueuedSynchronizer (5)

AQS中字段不多,如下所示:

public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializable { private transient volatile Node head;// 等待队列的头结点 private transient volatile Node tail;// 等待队列的尾节点 private volatile int state;// 同步状态,初始为0,获取锁时会加1,释放锁时减1,当重入锁时也会加1 static final long spinForTimeoutThreshold = 1000L;// 自旋时限1000纳秒 }

这里的head和tail分别指向的是同步器的同步队列的头结点与尾节点。这个同步队列采用双向链表实现,其节点就是之前介绍的内部类中的Node类型。

state表示同步状态,初始为0,表示未被持有,当其被某线程持有时,就会增加1,而且这个也是实现重入的基础,当该线程再次获取当前锁时,只需要state加1即可,每释放一个锁,state-1,直到state等于0时,该同步锁为完全释放。

spinForTimeoutThreshold是一个内置的快速自旋时限,当设置的超时时间小于这个值的时候,无需再执行等待设置,直接进入快速自旋即可,原因在于 spinForTimeoutThreshold 已经非常小了,非常短的时间等待无法做到十分精确,如果这时再次进行超时等待,相反会让nanosTimeout 的超时从整体上面表现得不是那么精确,所以在超时非常短的场景中,AQS会进行无条件的快速自旋。

2.5 方法解析

AQS中的方法可以粗分为四类:获取同步状态方法、释放同步状态方法、队列检验方法、队列监控方法,我们罗列一个表格来简单介绍下这些方法:

分类 序号 方法 说明 备注
获取同步状态方法   1   final void acquire(int arg)   独享获取同步状态,不响应中断    
获取同步状态方法   2   final void acquireInterruptibly(int arg)   独享获取同步状态,响应中断    
获取同步状态方法   3   final boolean tryAcquireNanos(int arg, long nanosTimeout)   独享获取同步状态,响应中断,响应超时    
获取同步状态方法   4   final void acquireShared(int arg)   共享获取同步状态,不响应中断    
获取同步状态方法   5   final void acquireSharedInterruptibly(int arg)   共享获取同步状态,响应中断    
获取同步状态方法   6   final boolean tryAcquireSharedNanos(int arg, long nanosTimeout)   共享获取同步状态,响应中断,响应超时    
释放同步状态方法   7   final boolean release(int arg)   独享释放同步状态    
释放同步状态方法   8   final void acquireShared(int arg)   共享释放同步状态    
队列检验方法   9   final boolean hasQueuedThreads()   校验同步队列中是否有线程在等待获取同步状态    
队列检验方法   10   final boolean hasContended()   校验是否有线程争用过此同步器(同步队列是否为空)    
队列检验方法   11   final boolean isQueued(Thread thread)   校验给定线程是否在同步队列之上    
队列检验方法   12   final boolean hasQueuedPredecessors()   校验是否有线程等待获取同步状态比当前线程时间长(同步队列中是都有前节点)    
队列检验方法   13   final boolean owns(ConditionObject condition)   校验给定的condition是否是使用当前同步器作为锁    
队列检验方法   14   final boolean hasWaiters(ConditionObject condition)   校验等待队列是否有等待线程    
队列监控方法   15   final int getWaitQueueLength(ConditionObject condition)   获取等待队列中线程数量    
队列监控方法   16   final Collection getWaitingThreads(ConditionObject condition)   获取等待队列中等待线程的集合    
队列监控方法   17   final Thread getFirstQueuedThread()   获取同步队列中的头节点线程    
队列监控方法   18   final int getQueueLength()   获取同步队列中线程数量    
队列监控方法   19   final Collection getQueuedThreads()   获取同步队列中线程的集合    
队列监控方法   20   final Collection getExclusiveQueuedThreads()   获取同步队列中欲独享获取同步状态的线程集合    
队列监控方法   21   final Collection getSharedQueuedThreads()   获取同步队列中欲共享获取同步状态的线程集合    

这些方法中重点就是获取同步状态方法和释放同步状态方法,下面我们也重点就看下这些个方法的实现:

acquire(int)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwwysj.html