并发编程 Condition

本文将介绍 JUC 中的 Condition。

一、什么是 Condition ?

Condition 是并发编程中的一个接口,实现了管程中的条件。

二、特点

1. Condition 的特点

在 synchronized 中,一个锁只会有一个等待队列。

在 JUC 中,利用 Condition,可以在一个锁中同时拥有多个条件,且每个条件分别对应有一个等待队列,它们可以独立地被放入线程、唤醒线程。

2. await()、signal()、signalAll()

await()、signal()、signalAll() 的语义和 wait()、notify()、notifyAll() 相同。

3. 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Hospital {

final Lock lock = new ReentrantLock();

// 条件:没有医生
final Condition noDoctor = lock.newCondition();

// 看病
void treat() {
lock.lock();
try {
while (没有医生) {
// 进入"没有医生等待队列"中等待
noDoctor.await();
}
...看病操作...
// 看病结束后,通知"没有医生等待队列"中的病人可以看病
noDoctor.signal();
} finally {
lock.unlock();
}
}
}

参考

  • Java 并发编程实战