notify()与notifyAll()

notify() :随机唤醒一个线程。

notifyAll():唤醒等待某个锁的所有任务。

在技术上,可能会有多个任务在所创建的任务上处于wait()状态,调用notifyAll()比只调用notify()更安全。

使用notify()而不是notifyAll()是一种优化。

在使用notify()时,在众多等待同一个锁的任务中只会有一个会被唤醒,如果你要使用notify(),你需要确保以下条件:

  1. 必须保证被唤醒的是恰当的任务,你所希望唤醒的任务。
  2. 所有的任务必须等待相同的条件。因为你有多个任务在等待不用的条件,那么你就不知道是否唤醒了恰当的任务。
  3. 当条件变化时,必须只有一个任务能够从中受益。
  4. 这些限制条件对所有可能存在的子类都必须总是起作用的。

如果这些规则有一个不满足,那么就必须使用notifyAll() 而不是notify().

原文地址:https://www.cnblogs.com/oskyhg/p/7092782.html