上一篇我们看了aqs中独占模式下acquire和release的代码(https://blog.csdn.net/a6822342/article/details/84839391)。下面我们来看看共享模式下的acquireShared和releaseShared的代码。
首先先看acquireShared的代码
public final void acquireShared(int arg) {
if (tryAcquireShared(arg) < 0)
doAcquireShared(arg);
}
首先看能不能直接获得资源,也就是执行tryAcquireShared(arg)方法,如果没有取得资源,则返回是负数,如果取得了资源但是后续的资源可以再进行获取则返回的是0,如果返回的是正数,那么代表着获取成功并且还有剩余资源,别的线程也能进行获取。Ps:tryAcquireShared方法需要子类自己去实现。
如果返回值小于0,那么通过doAcquireShared(arg)进入等待队列,等待获取资源。
下面我们来看看doAcquireShared(arg)方法。
private void doAcquireShared(int arg) {
final Node node = addWaiter(Node.SHARED);
boolean failed = true;
try {
boolean interrupted = false;
for (;;) {
final Node p = node.predecessor();//找先驱结点
if (p == head) {
int r = tryAcquireShared(arg);//尝试获取资源
if (r >= 0) {//获取到了资源
setHeadAndPropagate(node, r);//设置当前结点为头结点,然后去唤醒后续结点
p.next = null; // help GC 释放头结点,等待GC
if (interrupted)
selfInterrupt();
failed = false;/