美文网首页
3-Condition

3-Condition

作者: 鹏程1995 | 来源:发表于2020-02-04 17:53 被阅读0次

类介绍

概述

ConditionLock在使用上的关系大概就和Objectsynchronized(xx)块的关系相似。

  • Condition提供了await(),signal(),signalAll()方法,用于放弃锁阻塞、唤醒一个阻塞线程、唤醒所有阻塞线程。分别对应Object中的wait(),notify(),notifyAll()方法。
  • Condition通过Lock.newContdition()获得,从而两者之间存在多对一的关系。synchronized(xx)块中,可以通过对象xx来调用wait()方法,等待xx.wait(),也可以通过其他实例调用,Objectsynchronized是多对一的关系。【至少用起来是】

类继承关系

实现了Condition接口的类都可以通过Lock.newCondition()获得并进行相应线程的阻塞或者因锁而阻塞的线程的唤醒操作。

当然,Condition也是个普通的对象,也可以作为synchronized(xx)或者xx.wait()中的xx

源码介绍

void await() throws InterruptedException;

造成结果:

  1. 放弃当前线程占有的Condition对应的Lock并转入阻塞

  2. 等待:

    • 被唤醒
    • 被打断
    • 虚假唤醒

    后结束阻塞

void awaitUninterruptibly();

造成结果:

  1. 放弃当前线程占有的Condition对应的Lock并转入阻塞

  2. 等待:

    • 被唤醒
    • 虚假唤醒

    后结束阻塞

long awaitNanos(long nanosTimeout) throws InterruptedException;

造成结果:

  1. 放弃当前线程占有的Condition对应的Lock并转入阻塞

  2. 等待:

    • 被唤醒
    • 被打断
    • 虚假唤醒
    • 等待时间到达

    后结束阻塞

  • 入参:
    • 阻塞时间,单位为纳秒
  • 出参:
    • 还应该等待的时间【入参-已经等待的时间】
    • 正数表示提前唤醒了
    • 0表示时间到后正好被唤醒
    • 负数表示等待的时间比入参要长

boolean await(long time, TimeUnit unit) throws InterruptedException;

造成结果:

  1. 放弃当前线程占有的Condition对应的Lock并转入阻塞

  2. 等待:

    • 被唤醒
    • 被打断
    • 虚假唤醒
    • 等待时间到达

    后结束阻塞

  • 入参:
    • long: 阻塞时间数值
    • TimeUnit:数值对应的单位
  • 出参:
    • boolean:是否提前唤醒,true则是提前唤醒。false则唤醒时时间已经过去。

boolean awaitUntil(Date deadline) throws InterruptedException;

造成结果:

  1. 放弃当前线程占有的Condition对应的Lock并转入阻塞

  2. 等待:

    • 被唤醒
    • 被打断
    • 虚假唤醒
    • 等待时间到达

    后结束阻塞

  • 入参:
    • 唤醒时间点
  • 出参:
    • 和上一个函数的规则相同,表示是否提前唤醒

void signal();

造成结果:

  1. 唤醒一个因为此锁而等待的线程,使其进入竞争锁状态

void signalAll();

造成结果:

  1. 唤醒一个因为此锁而等待的线程,使其进入竞争锁状态

扩展

虚假唤醒

介绍

虚假唤醒,英文名为spurious wakeup,是指在线程因某个条件阻塞时,我的条件并没有满足,但是线程却结束了阻塞状态。即signal()/notify()没有被调用,但是某个因为await()/wait()阻塞方法却被唤醒。

应对

错误用法:

if(条件不符合){
    阻塞
}

正确用法:

while(条件不符合){
    阻塞
}

关于wait()时到底返回true还是false的问题

wait()返回的boolean表示是否提前唤醒。记住这句话就ok了。

参考文献

相关文章

  • 3-Condition

    类介绍 概述 Condition和Lock在使用上的关系大概就和Object和synchronized(xx)块的...

网友评论

      本文标题:3-Condition

      本文链接:https://www.haomeiwen.com/subject/xxqdxhtx.html