面试题答案
一键面试优势
- 更细粒度的控制:传统的
wait/notify
机制是基于对象的监视器,一个对象只能有一个等待队列。而Condition
可以为每个对象创建多个等待队列,允许线程在不同条件下等待和唤醒,实现更细粒度的线程控制。 - 灵活性更高:
Condition
提供了更丰富的方法,如awaitUninterruptibly
(不响应中断等待)、signalAll
(唤醒所有等待在该条件上的线程)等,能满足更复杂的线程协作场景。 - 性能优化:在某些场景下,通过
Condition
可以减少不必要的线程唤醒,提高系统性能。
关键代码示例
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ConditionExample {
private final Lock lock = new ReentrantLock();
private final Condition condition = lock.newCondition();
private boolean flag = false;
public void producer() throws InterruptedException {
lock.lock();
try {
while (flag) {
condition.await();
}
// 生产数据的逻辑
System.out.println("Producing data...");
flag = true;
condition.signalAll();
} finally {
lock.unlock();
}
}
public void consumer() throws InterruptedException {
lock.lock();
try {
while (!flag) {
condition.await();
}
// 消费数据的逻辑
System.out.println("Consuming data...");
flag = false;
condition.signalAll();
} finally {
lock.unlock();
}
}
}
在上述代码中,producer
方法和consumer
方法通过Condition
实现了线程间的协作。producer
在数据已存在时等待,生产完数据后唤醒consumer
;consumer
在数据不存在时等待,消费完数据后唤醒producer
。