finalbooleanacquireQueued(final Node node, int arg) { booleanfailed=true; try { booleaninterrupted=false; for (;;) { finalNodep= node.predecessor();//拿到node的上一个节点 //前置节点为head,说明可以尝试获取资源。排队成功后,尝试拿锁 if (p == head && tryAcquire(arg)) { setHead(node);//获取成功,更新head节点 p.next = null; // help GC failed = false; return interrupted; } //尝试拿锁失败后,根据条件进行park if (shouldParkAfterFailedAcquire(p, node) && parkAndCheckInterrupt()) interrupted = true; } } finally { if (failed) cancelAcquire(node); } } //获取资源失败后,检测并更新等待状态 privatestaticbooleanshouldParkAfterFailedAcquire(Node pred, Node node) { intws= pred.waitStatus; if (ws == Node.SIGNAL) /* * This node has already set status asking a release * to signal it, so it can safely park. */ returntrue; if (ws > 0) { /* * Predecessor was cancelled. Skip over predecessors and * indicate retry. */ do { //如果前节点取消了,那就往前找到一个等待状态的接待你,并排在它的后面 node.prev = pred = pred.prev; } while (pred.waitStatus > 0); pred.next = node; } else { /* * waitStatus must be 0 or PROPAGATE. Indicate that we * need a signal, but don't park yet. Caller will need to * retry to make sure it cannot acquire before parking. */ compareAndSetWaitStatus(pred, ws, Node.SIGNAL); } returnfalse; } //阻塞当前线程,返回中断状态 privatefinalbooleanparkAndCheckInterrupt() { LockSupport.park(this); return Thread.interrupted(); }