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

该方法表示共享式释放同步状态,源码如下:

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的等待/通知机制实现

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

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