java进阶-7-D -多线程-Lock专题- Condition 介绍
Condition 接口 :
很明显里面的额方法其实就2种,一种是等待, 一种是唤醒
await表示等待 ,更具传入的参数不同,能够实现的功能也不同:
await() | 进入等待状态 | |
awaitNanos(long) | 进入等待状态 多长时间之后自动苏醒 | |
await(long,TimeUnit) | 同上 | |
awaitUnit(Date) | 进入等待状态知道某一个时间点 | |
awaitUninterruptibly() | 进入等待状态只能被interrupt唤醒 |
在AQS里面有一个ConditionObject 类 实现了该接口 :
在await()方法中 找到 LockSupport.park(this) ,这个类又是应用了LockSupport,看来Lock这一块内部的切换到阻塞状态全都是靠SupportLock这个类来完成的。
非常典型的等待超时模式,可以理解一下
signal 唤醒操作
signal() | 唤醒该condition的某一个await | |
signalAll() | 唤醒该condition的所有await |
唤醒操作其实在Object类中也有几个方法功能上有相似点,都是等待 ~~ 唤醒 ,但是Object 争对的永远都是应用内所有的线程,而Condition只是针对当前该实例内的等待单位, 所以一般情况下 Object 我们习惯用 notifyAll ,而Condition 我们设计成只正对某一类的等待,每次也许就唤醒一个就好了,所以一般使用的是signal 唤醒某一个 。