通知/通知是否释放正在持有的锁

2022-09-01 10:15:42

我对等待和通知/通知所有感到困惑。

我知道每个java对象都有一个锁。我知道等待会释放其他线程的锁。通知/通知电话怎么样?notify/notifyAll 是否释放了它为其他线程持有的锁?


答案 1

不 -- /不要像这样释放锁。唤醒的线程无法运行,直到调用的代码释放其锁。notifynotifyAllwaitnotify

这是Javadoc所说的:

线程释放此监视器的所有权,并等待,直到另一个线程通知在此对象的监视器上等待的线程通过调用 notify 方法或 notifyAll 方法唤醒。然后,线程将等待,直到它可以重新获得监视器的所有权并恢复执行。


答案 2
  • wait( ) 告诉调用线程放弃监视器并进入睡眠状态,直到其他线程进入同一监视器并调用 notify( )。

  • notify( ) 唤醒在同一对象上调用 wait( ) 的线程。

  • notifyAll( ) 唤醒在同一对象上调用 wait( ) 的所有线程。优先级最高的线程将首先运行。