int r = tryAcquireShared(arg, id); if (r >= 0) { setHeadAndPropagate(node, r);
int r = tryAcquireShared(arg, id); if (r >= 0) { setHeadAndPropagate(node, r);
/** * Acquires in shared uninterruptible mode. * * @param arg * the acquire argument */ private void doAcquireShared(int arg, Object id) { final Node node = addWaiter(Node.SHARED); try { boolean interrupted = false; for (;;) { final Node p = node.predecessor(); if (p == head) { int r = tryAcquireShared(arg, id); if (r >= 0) { setHeadAndPropagate(node, r); p.next = null; // help GC if (interrupted) selfInterrupt(); return; } } if (shouldParkAfterFailedAcquire(p, node) && parkAndCheckInterrupt()) interrupted = true; } } catch (RuntimeException ex) { cancelAcquire(node); throw ex; } }