该方法表示共享式释放同步状态,源码如下:
public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializable { public final boolean releaseShared(int arg) { // 尝试共享式释放同步状态,成功后唤醒后继节点 if (tryReleaseShared(arg)) { doReleaseShared(); return true; } return false; } }解析:很简单,其中的doReleaseShared方法我们也了解了。
tryReleaseShared源码:
public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializable { protected boolean tryReleaseShared(int arg) { throw new UnsupportedOperationException(); } }解析:和前面的那几个模板方法一样,需要子类来实现。
剩下的方法都是一些校验和监控的方法,并不涉及重点逻辑,不再赘述,下面做一个总结
三、总结总结:
AQS同步器内部维护了一个底层为双向链表的同步队列,用于保存那些获取同步状态失败的线程。每个AQS同步器还可以关联多个Condition,其中每个Condition内部维护了一个底层为单向链表的等待队列,用于保存那些基于特定条件而陷入等待的线程。
内部类Node描述的是同步队列和等待队列中节点的类型。节点有两点需要注意,那就是节点的模式与状态
节点模式:
EXCLUSIVE:独享式
SHARED:共享式
节点状态:
0:初始状态,该状态下不会唤醒后继节点
CANCELLED(1):取消状态,节点线程被中断或超时
SIGNAL(-1):唤醒状态,表示该节点的后继节点被阻塞,需要唤醒
CONDITION(-2):表示当前节点位于等待队列中,在等待条件满足
PROPAGATE(-3):表示共享式获取同步状态的传播
内部类ConditionObject是Condition的实现类,作为附着在同步器上的一个功能,可用可不用;它提供了一些方法来执行等待和唤醒操作:
等待操作:
await():响应中断
awaitNanos(long):响应中断,响应超时
awaitUninterruptibly():不响应中断,不响应超时
唤醒操作:
signal()
signalAll()
AQS同步器提供了多个方法从来辅助实现同步状态的获取与释放:
独享式获取:
acquire(int):不响应中断,不响应超时
acquireInterruptibly(int):响应中断
tryAcquireNanos(int, long):响应中断,响应超时
独享式释放:
release(int)
共享式获取:
acquireShared(int):不响应中断,不响应超时
acquireSharedInterruptibly(int):响应中断
tryAcquireSharedNanos(int, long):响应中断,响应超时
共享式释放:
releaseShared(int)
参考:
Java并发之AQS详解
深入理解AbstractQueuedSynchronizer(AQS)
深入理解AbstractQueuedSynchronizer(三)
详解Condition的await和signal等待/通知机制
【死磕Java并发】-----J.U.C之AQS:同步状态的获取与释放
【JUC】JDK1.8源码分析之AbstractQueuedSynchronizer(二)
再谈AbstractQueuedSynchronizer2:共享模式与基于Condition的等待/通知机制实现