ReentrantLock配合Condition可替代Object的wait/notify,支持多等待队列、可中断与超时等待,且更安全灵活;核心映射为await/signal/signalAll对应wait/notify/notifyAll,需严格遵循加锁→while判断→await→操作→解锁流程,并用while防虚假唤醒。

ReentrantLock 配合 Condition 可以实现和 Object 的 wait()/notify()/notifyAll() 类似的效果,但更灵活、更安全——它支持多个等待队列、可中断等待、超时等待,并且与锁解耦(不是绑定在对象头上的监视器)。
核心对应关系
理解它们的映射是关键:
-
Object.wait()→condition.await() -
Object.notify()→condition.signal() -
Object.notifyAll()→condition.signalAll() -
synchronized(obj)→lock.lock() / lock.unlock()
基本使用模式(类比 synchronized + wait/notify)
必须严格遵循“先加锁 → 判断条件 → 不满足则 await → 满足则操作 → 解锁”流程,且 await() 必须在持有锁的前提下调用:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
// 等待线程
lock.lock();
try {
while (!conditionMet()) { // ⚠️ 一定要用 while,防止虚假唤醒
condition.await();
}
// 执行业务逻辑
} finally {
lock.unlock();
}
// 通知线程
lock.lock();
try {
// 修改共享状态,使 conditionMet() 可能变为 true
makeConditionTrue();
condition.signal(); // 或 signalAll()
} finally {
lock.unlock();
}
多条件分离:Object 做不到的增强能力
Object 监视器只有一个隐式等待队列,而一个 ReentrantLock 可创建多个独立 Condition 实例,实现精准唤醒:
立即学习“Java免费学习笔记(深入)”;
Lock lock = new ReentrantLock();
Condition notFull = lock.newCondition(); // 缓冲区未满
Condition notEmpty = lock.newCondition(); // 缓冲区非空
// 生产者:等 notFull
lock.lock();
try {
while (isFull()) notFull.await();
produce();
notEmpty.signal(); // 唤醒消费者
} finally {
lock.unlock();
}
// 消费者:等 notEmpty
lock.lock();
try {
while (isEmpty()) notEmpty.await();
consume();
notFull.signal(); // 唤醒生产者
} finally {
lock.unlock();
}
这种分工避免了 notifyAll() 带来的无效唤醒,提升性能和可控性。
注意关键细节
-
await() 会自动释放锁,并在被唤醒后重新竞争并获取锁才返回 —— 这和
wait()行为一致 - 必须用 while 循环检查条件,不能用 if:因可能被虚假唤醒(spurious wakeup)或被错误 signal
-
signal()不保证立即唤醒,也不保证唤醒顺序(默认非公平),如需 FIFO 可用new ReentrantLock(true) -
await()可响应中断:awaitInterruptibly();也可带超时:awaitNanos(timeout)、awaitUntil(deadline)

















