共享式获取同步状态-acquireShared(int arg)
与独占式类似,只是返回结果大于等于0表示获取到了。
//共享式获取同步状态(锁)
public final void acquireShared(int arg) {
//尝试调用tryAcquireShared(int arg)方法获取同步状态
//返回值>=0时表示获取到了同步状态
if (tryAcquireShared(arg) < 0)
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) {//如果返回值大于等于0,则表示获取同步状态成功
setHeadAndPropagate(node, r);
p.next = null; // help GC
if (interrupted)
selfInterrupt();
failed = false;
//从自旋退出
return;
}
}
if (shouldParkAfterFailedAcquire(p, node) &&
parkAndCheckInterrupt())
interrupted = true;
}
} finally {
if (failed)
cancelAcquire(node);
}