测试你对Condition接口、await/signal机制和生产者消费者模式的理解
Condition必须与Lock配合使用,通过Lock.newCondition()方法创建。一个Lock可以创建多个Condition,每个Condition维护自己的等待队列,这是Condition相比Object.wait/notify的重要优势。
虚假唤醒是指线程在条件未满足时被意外唤醒。这可能由于系统级别的原因发生,因此必须在while循环中检查条件,确保条件真正满足后才继续执行。
if (buffer.isFull()) { notFull.await(); } buffer.put(item);
应该使用while循环而不是if语句。因为线程被唤醒后,条件可能已经被其他线程改变,需要重新检查条件。if语句只检查一次,可能导致在条件不满足时继续执行。
signal()只唤醒等待队列中的一个线程,而signalAll()唤醒所有等待的线程。选择哪个方法取决于具体场景:如果条件变化只能满足一个线程,使用signal();如果可能满足多个线程,使用signalAll()。
Condition的使用方式实际上比Object.wait/notify更复杂,需要显式创建Lock和Condition对象。但它提供了更强大的功能:多个等待队列、超时等待、更好的性能等。