回答
notify()
用于唤醒在该对象的监视器上等待的单个线程。如果有多个线程在该对象上等待,notify()
会随机选择其中一个线程进行唤醒。
notifyAll()
用于唤醒在该对象的监视器上等待的所有线程。所有被唤醒的线程将重新获取对象的锁,但是只有其中一个线程能获取成功,其他线程则会继续等待直到再次获取锁。
扩展
锁池和等待池
锁池(Entry Set):指那些试图获取某个对象的锁,当又没有获取到锁的线程的集合。当一个线程尝试获取对象锁时,如果该对象锁已经被其他线程持有,那么该线程就会进入锁池,等待获取锁的机会。
等待池(Wait Set):指那些调用了 wait()
方法,并且当前正在等待被唤醒的线程的集合。当一个线程调用某个对象的 wait()
方法,它会释放该对象的锁,并进入这个对象的等待池,直到以下三种情况之一发生:
- 该线程被唤醒(通过调用
notify()
或notifyAll()
)。 - 该线程被中断。
- 指定的等待时间结束(如果调用的是
wait(long timeout)
)。
如下图: