tryRelease,尝试释放锁
protected final boolean tryRelease(int releases) {
if (!isHeldExclusively())
throw new IllegalMonitorStateException();
int nextc = getState() - releases;
boolean free = exclusiveCount(nextc) == 0;
if (free)
setExclusiveOwnerThread(null);
setState(nextc);
return free;
}
- !isHeldExclusively();判断持有独占锁的线程是不是当前释放锁的线程,如果不是就要抛异常
- int nextc = getState() - releases;将state变量减一
- boolean free = exclusiveCount(nextc) == 0;通过获取state的第十六位看一下是否还是有写锁的标记,减一完是不是已经把所有所释放了,如果不等于0就返回false下边if判断就进不去。
if (free)如果free==true就代表写锁都释放完毕了,就要把线程标记设置为null。同时返回free=true;
释放写锁成功开始唤醒线程
由于释放写锁成功了,那么tryRelease就会返回true。Node h = head;拿到头节点
- h != null && h.waitStatus != 0;h != null代表有线程在队列中等待,同时判断一下watisStatus只有!=0了意味着线程才能被唤醒(规定)。
- unparkSuccessor(h);唤醒线程(AQS同一套的唤醒线程的方法)