锁释放的逻辑很简单,都是唤醒后继线程,但并不会把队列中对应的节点释放掉,释放的任务有下个加锁成功的线程负责:
exclusive:
public final boolean release(int arg) {
if (tryRelease(arg)) {
Node h = head;
if (h != null && h.waitStatus != 0)
unparkSuccessor(h);
return true;
}
return false;
}
shared:
public final boolean releaseShared(int arg) {
if (tryReleaseShared(arg)) {
doReleaseShared();
return true;
}
return false;
}
doReleaseShared()的作用就是唤醒后继线程。