使用Condition

但是,synchronized可以配合waitnotify实现线程在条件不满足时等待,条件满足时唤醒,用ReentrantLock我们怎么编写waitnotify的功能呢?

答案是使用Condition对象来实现waitnotify的功能。

我们仍然以TaskQueue为例,把前面用synchronized实现的功能通过ReentrantLockCondition来实现:

可见,使用时,引用的Condition对象必须从Lock实例的newCondition()返回,这样才能获得一个绑定了Lock实例的Condition实例。

  • await()会释放当前锁,进入等待状态;

  • 会唤醒所有等待线程;

  • 唤醒线程从await()返回后需要重新获得锁。

  1. if (condition.await(1, TimeUnit.SECOND)) {
  2. } else {
  3. // 指定时间内没有被其他线程唤醒
  4. }

可见,使用Condition配合Lock,我们可以实现更灵活的线程同步。

Condition可以替代waitnotify

对象必须从Lock对象获取。

读后有收获可以支付宝请作者喝咖啡,读后有疑问请加微信群讨论

使用Condition - 图1