Condition
2019-07-04 本文已影响0人
whynotybb
在Java中所有对象都继承自Object对象,所以所有对象都继承了以下的四个方法:notify(),notifyall() wait(),wait(long)。但是使用Object提供的这些方法只能在同步方法或同步块中使用。而Condition提供的signal和await需配合Lock使用。


因为Condition是interface,创建一个Condition使用lock.newCondition()方法。该方法实际会创建一个ConditionObject对象。
Condition内部维护了一个等待队列,锁内部维护的是同步队列。同步队列为双向队列,而等待队列为单向队列。

一个Lock可以多次创建Condition对象,也就是说一个锁可以有一个同步队列,同时可以持有多个等待队列。

await的功能是将当前线程加入到等待队列,并释放当前线程持有的锁,在fullRelease中实现。并且在释放锁的时候会调用唤醒同步队列中的后继结点,具体是在unParkSuccessor中实现的。



sign()&signall



