依旧是两个生产者加一个消费者,实现代码如下:
public static void main(String[] args) { Factory factory = new Factory(); // 生产者 Thread producer = new Thread(() -> { try { factory.put(); } catch (InterruptedException e) { e.printStackTrace(); } }, "生产者"); producer.start(); // 生产者 2 Thread producer2 = new Thread(() -> { try { factory.put(); } catch (InterruptedException e) { e.printStackTrace(); } }, "生产者2"); producer2.start(); // 消费者 Thread consumer = new Thread(() -> { try { factory.take(); } catch (InterruptedException e) { e.printStackTrace(); } }, "消费者"); consumer.start(); }
执行的结果如下图所示:
通过以上结果可以看出:当我们调用 notifyAll
时确实不会造成线程“假死”了,但会造成所有的生产者都被唤醒了,但因为待执行的任务只有一个,因此被唤醒的所有生产者中,只有一个会执行正确的工作,而另一个则是啥也不干,然后又进入等待状态,这就行为对于整个程序来说,无疑是多此一举,只会增加线程调度的开销,从而导致整个程序的性能下降。
反观 Condition
的 await
和 signal
方法,即使有多个生产者,程序也只会唤醒一个有效的生产者进行工作,如下图所示: