JDK
版本:AdoptOpenJDK 11.0.10+9
1 基本概念
j.u.c
包提供的Condition
接口,可以看作是对Object
的wait()
、notify()
、notifyAll()
的的替代,与Lock
配合使用,一般用于线程间的通信。
获取一个Condition
必须要通过Lock
的newCondition()
方法。该方法定义在接口Lock
下面,返回的结果是绑定到此 Lock
对象的新 Condition
对象。
一个Lock
对象可以有多个Condition
对象,每个Condition
对象都有自己的条件队列。
当线程执行
Condition
对象的await()
方法时,线程会进入Condition
对象的条件队列进行等待,并释放获得的锁,等待其他线程唤醒或者中断。
2 接口定义
Condition
接口定义如下:
public interface Condition {
/**
* 使当前调用线程进入等待区,等待其他线程唤醒或者中断
*/
void await() throws InterruptedException;
/**
* 使当前调用线程进入等待区,等待其他线程唤醒
*/
void awaitUninterruptibly();
/**
* 使当前调用线程进入等待区,等待其他线程唤醒或者中断,或者超时
*/
long awaitNanos(long nanosTimeout) throws InterruptedException;
/**
* 使当前调用线程进入等待区,等待其他线程唤醒或者中断,或者超时
*/
boolean await(long time, TimeUnit unit) throws InterruptedException;
/**
* 使当前调用线程进入等待区,等待其他线程唤醒或者中断,或者到达指定时间
*/
boolean awaitUntil(Date deadline) throws InterruptedException;
/**
* 唤醒一个等待的线程
*/
void signal();
/**
* 唤醒所有等待的线程
*/
void signalAll();
}
3 实现类
Condition
接口的实现类是位于AQS
内部的ConditionObject
类。其内部维护了一个Node
节点组成的链表(条件队列)。
public class ConditionObject implements Condition, java.io.Serializable {
// 条件队列的第一个节点
private transient Node firstWaiter;
// 条件队列的最后一个节点
private transient Node lastWaiter;
......
}
Node
链表就是条件队列,其中每个Node
节点都是对线程的封装。
4 方法解析
主要讲解await()
、signal()
、signalAll()
方法。
4.1 await() 等待
线程调用await()
方法后,将会进入条件队列,并释放获得的锁。
public final void await() throws InterruptedException {
// 响应中断
if (Thread.interrupted())
throw ne