第7章测试:Condition条件变量

测试你对Condition接口、await/signal机制和生产者消费者模式的理解

1 关于Condition接口,以下说法正确的是?

解析:

Condition必须与Lock配合使用,通过Lock.newCondition()方法创建。一个Lock可以创建多个Condition,每个Condition维护自己的等待队列,这是Condition相比Object.wait/notify的重要优势。

2 在使用Condition.await()时,为什么要在while循环中检查条件?

解析:

虚假唤醒是指线程在条件未满足时被意外唤醒。这可能由于系统级别的原因发生,因此必须在while循环中检查条件,确保条件真正满足后才继续执行。

3 在生产者消费者模式中,以下代码片段有什么问题?
if (buffer.isFull()) {
    notFull.await();
}
buffer.put(item);

解析:

应该使用while循环而不是if语句。因为线程被唤醒后,条件可能已经被其他线程改变,需要重新检查条件。if语句只检查一次,可能导致在条件不满足时继续执行。

4 signal()和signalAll()的主要区别是什么?

解析:

signal()只唤醒等待队列中的一个线程,而signalAll()唤醒所有等待的线程。选择哪个方法取决于具体场景:如果条件变化只能满足一个线程,使用signal();如果可能满足多个线程,使用signalAll()。

5 相比Object.wait/notify,Condition的主要优势不包括?

解析:

Condition的使用方式实际上比Object.wait/notify更复杂,需要显式创建Lock和Condition对象。但它提供了更强大的功能:多个等待队列、超时等待、更好的性能等。