源码
public void unlock() {sync.release(1);}
public final boolean release(int arg) {if (tryRelease(arg)) {Node h = head;//waitStatus =-1 表示自己有义务去唤醒别人if (h != null && h.waitStatus != 0)unparkSuccessor(h);return true;}return false;}
protected final boolean tryRelease(int releases) {int c = getState() - releases;if (Thread.currentThread() != getExclusiveOwnerThread())//基本不会发生throw new IllegalMonitorStateException();boolean free = false;if (c == 0) {free = true;setExclusiveOwnerThread(null);}setState(c);return free;}
unparkSuccessor
private void unparkSuccessor(Node node) {int ws = node.waitStatus;if (ws < 0)//将waitstatus由-1改成0,防止多线程情况下的访问导致需要额外唤醒别的线程comNode s = node.next;//非正常情况 下一个节点被中断if (s == null || s.waitStatus > 0) {s = null;for (Node t = tail; t != null && t != node; t = t.prev)if (t.waitStatus <= 0)s = t;}//正常情况if (s != null)LockSupport.unpark(s.thread);}
解锁流程图
解锁之前
解锁之后

