`notify()` 和 `notifyAll()` 是 Java 中用于线程间通信的方法,都是定义在 `java.lang.Object` 类中的。
1. `notify()`:
`notify()` 用于唤醒在该对象上调用 `wait()` 方法被阻塞的单个线程(等待队列中的一个线程)。选择被唤醒的线程是不确定的,取决于 JVM 的实现。
如果有多个线程在等待同一个对象上的监视器锁,并且调用了 `notify()` 方法,只会唤醒等待队列中的一个线程,唤醒哪个线程并不确定,可能是先进入等待状态的线程,也可能是其他方式。
2. `notifyAll()`:
`notifyAll()` 也用于唤醒在该对象上调用 `wait()` 方法被阻塞的所有线程(等待队列中的所有线程)。
当调用 `notifyAll()` 方法时,会唤醒等待队列中的所有线程,使它们可以竞争对象的监视器锁。
一般来说,使用 `notifyAll()` 的情况更为常见,因为它能确保所有等待的线程都有机会重新竞争锁。但在某些情况下,如果知道只有一个线程会被唤醒,并且唤醒特定线程没有太大影响,那么可以使用 `notify()` 来减少竞争。