工作生活

Condition

2019-07-04  本文已影响0人  whynotybb

在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

上一篇 下一篇

猜你喜欢

热点阅读