使用Condition
但是,synchronized
可以配合wait
和notify
实现线程在条件不满足时等待,条件满足时唤醒,用ReentrantLock
我们怎么编写wait
和notify
的功能呢?
答案是使用Condition
对象来实现wait
和notify
的功能。
我们仍然以TaskQueue
为例,把前面用synchronized
实现的功能通过ReentrantLock
和Condition
来实现:
可见,使用时,引用的Condition
对象必须从Lock
实例的newCondition()
返回,这样才能获得一个绑定了Lock
实例的Condition
实例。
await()
会释放当前锁,进入等待状态;会唤醒所有等待线程;
唤醒线程从
await()
返回后需要重新获得锁。
if (condition.await(1, TimeUnit.SECOND)) {
} else {
// 指定时间内没有被其他线程唤醒
}
可见,使用Condition
配合Lock
,我们可以实现更灵活的线程同步。
Condition
可以替代wait
和notify
;
对象必须从Lock
对象获取。