Object.notify()/notifyAll()的选用

本文探讨了在Java中使用Object.notifyAll()与Object.notify()的区别。notifyAll()虽然效率较低,但能确保正确唤醒所有等待线程。而notify()只唤醒一个线程,适用于特定场景,如一次通知只需唤醒一个线程且所有等待线程处理逻辑相同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现通知比较流行保守的方法是优先使用notifyAll()保障正确性
Object.notify()可能导致信号丢失的正确性问题,Object.notifyAll()虽然效率不高(把不需要唤醒的等待线程给唤醒),但是保证正确性方面有保障。

只有在以下两个条件都满足的情况下使用notify()代替notifyAll()

  1. 一次通知仅需要唤醒至多一个线程
  2. 相应对象上的所有等待线程都是同质等待线程同质等待线程:指线程使用同一个保护条件,并且这些线程在Objec.wait()调用返回之后的处理逻辑一致