导览
不响应中断
public final void acquireShared(int arg) {
//tryAcquireShared尝试获取共享式同步状态(需重写)
// 负数:表示获取失败
// 零值:表示当前结点获取成功, 但是后继结点不能再获取了
// 正数:表示当前结点获取成功, 并且后继结点同样可以获取成功
if (tryAcquireShared(arg) < 0)
doAcquireShared(arg);//获取失败则将当前线程构造成节点放入同步队列
}
private void doAcquireShared(int arg) {
final Node node = addWaiter(Node.SHARED);//将当前线程构造成共享式节点放入同步队列
boolean interrupted = false;
try {
for (;;) {
final Node p = node.predecessor();
//若前驱节点为头结点则尝试获取同步状态
if (p == head) {
int r = tryAcquireShared(arg);
if (r >= 0) {
//同步状态获取成功
setHeadAndPropagate(node, r);//设置头结点,传播同步状态(共享式获取同步状态的核心之一)
p.next = null; // help GC
return;
}
}
if (shouldParkAfterFailedAcquire(p, node))//获取失败后,判断是否可将线程阻塞(挂起)
interrupted |= parkAndCheckInterrupt();
}
} catch (Throwable t) {
cancelAcquire(node);
throw t;
} finally {
if (interrupted)
selfInterrupt();
}
}
查看