await方法:
1. 线程中断之后再调用await会直接抛异常
2. 将当前线程包装成一个node放入条件队列中 如果条件队列的尾节点是取消状态 当前线程会把所有取消状态的节点在条件队列中出队
3. 完全释放锁
4. 判断如果当前node是在条件队列中的话就挂起当前线程等待被signal被唤醒
5. 当线程被唤醒
5.1 被外部线程中断唤醒 会直接进入阻塞队列 然后在调用acquireQueued方法时被park 等待被唤醒获取到锁
5.2 被signal唤醒 也会在调用acquireQueued方法时被park 等待被唤醒获取到锁
6. 如果是在条件队列中被中断的await会抛出异常 如果在条件队列外被中断 会设置线程中断为true
signal方法:
1. 未持锁线程唤醒会抛异常
2. 迁移条件队列中的第一个node 如果返回false继续唤醒下一个node
3. 迁移node到阻塞队列使用完整入队 如果迁移到阻塞队列后的前置节点是取消状态就唤醒当前node 去调用shouldParkAfterFailedAcquire方法 跳过取消的node 然后进行阻塞 等待获取锁成功