调用Condition.await()必须在ReentrantLock内。即需要加锁后调用。
根据MISA模型,await()方法会释放持有的锁,所以要先获取锁,才能释放锁。
同样调用对象的await()时,必须在Synchronized同步块中。因为调用await()方法也会释放锁
原理看CyclicBarrier
await()方法
前半段:
释放锁,进入条件队列中,然后阻塞线程
过度阶段
被其他调用singal、singalAll的线程唤醒(唤醒前:完成条件队列到同步队列的转移)
后半段(独占锁逻辑)
获取锁(如果获取失败,再次阻塞)。执行完逻辑后,释放锁(唤醒同步队列中head的后续节点)