2024-08-04
版权声明:本文为博主付费文章,严禁任何形式的转载和摘抄,维权必究。 本文链接:https://www.skjava.com/mianshi/baodian/detail/1366308837

回答

notify() 用于唤醒在该对象的监视器上等待的单个线程。如果有多个线程在该对象上等待,notify() 会随机选择其中一个线程进行唤醒。

notifyAll() 用于唤醒在该对象的监视器上等待的所有线程。所有被唤醒的线程将重新获取对象的锁,但是只有其中一个线程能获取成功,其他线程则会继续等待直到再次获取锁。

扩展

锁池和等待池

锁池(Entry Set):指那些试图获取某个对象的锁,当又没有获取到锁的线程的集合。当一个线程尝试获取对象锁时,如果该对象锁已经被其他线程持有,那么该线程就会进入锁池,等待获取锁的机会。

等待池(Wait Set):指那些调用了 wait() 方法,并且当前正在等待被唤醒的线程的集合。当一个线程调用某个对象的 wait() 方法,它会释放该对象的锁,并进入这个对象的等待池,直到以下三种情况之一发生:

  1. 该线程被唤醒(通过调用 notify()notifyAll())。
  2. 该线程被中断。
  3. 指定的等待时间结束(如果调用的是 wait(long timeout))。

如下图: