为什么wait和notify方法要在同步块中调用?

Posted 四猿外

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么wait和notify方法要在同步块中调用?相关的知识,希望对你有一定的参考价值。

  1. 只有在调用线程拥有某个对象的独占锁时,才能够调用该对象的wait(),notify()和notifyAll()方法。
  2. 如果你不这么做,你的代码会抛出IllegalMonitorStateException异常。
  3. 还有一个原因是为了避免wait和notify之间产生竞态条件。

wait()方法强制当前线程释放对象锁。这意味着在调用某对象的wait()方法之前,当前线程必须已经获得该对象的锁。因此,线程必须在某个对象的同步方法或同步代码块中才能调用该对象的wait()方法。

在调用对象的notify()和notifyAll()方法之前,调用线程必须已经得到该对象的锁。因此,必须在某个对象的同步方法或同步代码块中才能调用该对象的notify()或notifyAll()方法。

调用wait()方法的原因通常是,调用线程希望某个特殊的状态(或变量)被设置之后再继续执行。调用notify()或notifyAll()方法的原因通常是,调用线程希望告诉其他等待中的线程:“特殊状态已经被设置”。这个状态作为线程间通信的通道,它必须是一个可变的共享状态(或变量)。

以上是关于为什么wait和notify方法要在同步块中调用?的主要内容,如果未能解决你的问题,请参考以下文章

为什么 wait(), notify()和 notifyAll ()必须在同步方法或 者同步块中被调用?

为什么 wait(), notify()和 notifyAll ()必须在同步方法或 者同步块中被调用?

面试官:为什么wait(),notify()必须在同步方法/代码块中调用?

面试官:为什么wait(),notify()必须在同步方法/代码块中调用?

为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?

解释为什么wait()和notify(), notifyAll()要放在同步块中