在Java中所有对象都继承自Object对象,所以所有对象都继承了以下的四个方法:notify(),notifyall() wait(),wait(long)。但是使用Object提供的这些方法只能在同步方法或同步块中使用。而Condition提供的signal和await需配合Lock使用。
来自Object
Condition接口提供的方法
因为Condition是interface,创建一个Condition使用lock.newCondition()方法。该方法实际会创建一个ConditionObject对象。
Condition内部维护了一个等待队列,锁内部维护的是同步队列。同步队列为双向队列,而等待队列为单向队列。
AQS中的内部类ConditionObject
一个Lock可以多次创建Condition对象,也就是说一个锁可以有一个同步队列,同时可以持有多个等待队列。
await源码
await的功能是将当前线程加入到等待队列,并释放当前线程持有的锁,在fullRelease中实现。并且在释放锁的时候会调用唤醒同步队列中的后继结点,具体是在unParkSuccessor中实现的。
添加结点到等待队列
fullyRelease源码
sign()&signall