目录
在多线程编程中,线程间的协调通信时保证程序正确性的关键。Java提供了多种线程协调机制。而
Condition接口作为
java.util.concurrent.locks包中的重要组件,为我们提供了比传统
synchronized+
wait()/notify()更灵活、更精细的线程控制能力。
一、Condition是什么?
java.util.concurrent.locks.Condition接口是显式锁(Lock)的线程协调工具, 它允许线程在特定条件下等待,并在条件满足时被唤醒。每个Condition对象都有一个Lock绑定,实现线程间的精通通信。
与传统的Object.wait()/notify()相比,Condition最大的优势在于支持多个等待队列, 这意味着我们可以不同的等待条件创建不同的Condition对象,实现更精细的线程控制。
二、Condition的核心发方法详解
2.1 等待方法
| 方法 | 说明 | 返回值 |
|---|---|---|
void wait() |
使当前线程等待,知道被唤醒或中断 | |
boolean await(long time,TimeUnit unit) |
限时等待,超时返回false | 是否在指定时间内被唤醒 |
long awaitNanos(long nanosTimeout) |
纳秒级超时等待 | 剩余等待时间(纳秒) |
void awaitUninterruptibly() |
不可中断的等待 | |
boolean awaitUntil(Date deadline) |
等待到指定时间点 | 是否在截止时间前被唤醒 |
2.2 唤醒方法
| 方法 | 说明 |
|---|---|
void signal() |
唤醒一个等待在该Condition上的线程 |
void singanlAll() |
唤醒所有等待在该Condition上的线程 |
三、Condition的使用范式
3.1 基本使用步骤
// 1. 创建锁和条件
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
// 2. 等待条件的标准范式
public void waitCondition() throws InterruptedException {
lock.lock();
try {
while (!conditionSatisfied) {
// 必须使用while循环检查条件
condition.await(); // 释放锁并等待
}
// 条件满足,执行后续操作
doSomething();
} finally {
lock.unlock(); // 确保锁被释放
}
}
// 3. 通知条件的标准范式
public void signalCondition() {
lock.lock();
try {
// 改变条件状态
changeCondition();
condition.signal(); // 或signalAll()
} finally {
lock.unlock();
}
}
3.2 为什么必须使用while循环?
防止虚假唤醒(spurious wakeup)。线程可能在没有收到明确通知的情况下被唤醒,使用while循环可以确保条件真正满足后才继续执行。
四、经典案例:生产者-消费者模型
下面是一个使用Condition实现的有界缓冲区,展示了多条件队列的典型应用:
import java.util.concurrent.locks.*;
/**
* 使用Condition实现的有界缓冲区(生产者-消费者模型)
*/
public class BoundedBuffer {
private final

最低0.47元/天 解锁文章
1305

被折叠的 条评论
为什么被折叠?



