Author:赵志乾
Date:2019-03-21
Declaration:All Right Reserved!!!
1、Condition接口
一个锁可以关联一个或多个Condition。在锁控制的临界区内使用Condition是为了允许线程获取锁后查看等待的某个条件是否满足,如果不满足则可以调用Condition接口的await()方法,将锁释放并被挂起,等待其他线程在Condition对象上将其唤醒。
与锁关联的Condition对象都是通过Lock接口的newCondition()方法创建的,并且只能在该锁的临界区内部使用。
注:当一个线程调用了Condition对象的signal()或signalAll()方法后,一个或多个在该条件上挂起的线程将被唤醒,但这并不能保证让他们等待的条件已经满足,所以必须在while循环中调用await(),即条件成立之前不能离开这个循环。
由于调用await()方法而进入休眠的线程可能会被中断,所以必须处理InterruptedException异常。
2、await方法
Condition接口提供多个await方法,如下:
· await() 线程将被挂起,直到其他线程调用了对应的signal()或signalAll()方法,或者线程被中断;
· awaitUninterruptibly() 线程将被挂起,直到其他线程调用了对应的signal()或signalAll()方法;
· awaitUntil(Date date) 与 await(long time,TimeUnit unit) 线程将被挂起,直到其他线程调用了对应的signal()或signalAll()方法,或线程被中断,或等待的时间已经过去。
3、常用范例
private final Lock lock = new ReentrantLock();
private final Condition condition = lock.newCondition();
public void method1(参数列表){
lock.lock();
try{
//逻辑
while(守护条件){
condition.await();
}
//逻辑
}
finally{
lock.unlock();
}
}
public void method2(参数列表){
lock.lock();
try{
//逻辑
condition.signal();
}
finally{
lock.unlock();
}
}
参考资料:《java7并发编程实战手册》