生产者和生产者 2 依次会被交替的唤醒进行工作,所以这样执行时并没有任何多余的开销,从而相比于 notifyAll
而言整个程序的性能会提升不少。
总结
本文我们通过代码和流程图的方式演示了 wait
方法和 notify/notifyAll
方法的使用缺陷,它的缺陷主要有两个,一个是在极端环境下使用 notify
会造成程序“假死”的情况,另一个就是使用 notifyAll
会造成性能下降的问题,因此在进行线程通讯时,强烈建议使用 Condition
类来实现。
PS:有人可能会问为什么不用 Condition 的 signalAll 和 notifyAll 进行性能对比?而使用 signal 和 notifyAll 进行对比?我只想说,既然使用 signal 可以实现此功能,为什么还要使用 signalAll 呢?这就好比在有暖气的 25 度的房间里,穿一件短袖就可以了,为什么还要穿一件棉袄呢?