为什么在对象类中使用wait(),notify()和notifyAll()方法

时间:2020-01-09 10:35:07  来源:igfitidea点击:

为什么wait(),notify()和notifyAll()方法在Java的Object类中而不在Thread类中,尽管这些方法用于多线程上下文中,这是许多访谈中经常问到的一个问题。这篇文章试图给出将wait(),notify()和notifyAll()方法放入Object类的原因。

为什么wait(),notify()和notifyAll()方法位于对象类中

1 –从这些方法本身的描述中可以清楚地看出第一个原因。

  • wait –使拥有对象的监视器锁的当前线程放弃锁并进入等待状态。
  • notify –唤醒正在该对象的监视器上等待的单个线程。
  • notifyAll –唤醒该对象的监视器上正在等待的所有线程。

因此,我们会看到所有这些方法都在使用与对象关联的锁(监视器)。它是拥有锁的对象,并且该锁被线程获取以进入同步块。由于wait,notify和notifyAll方法正在向锁发出信号,或者放弃它,或者唤醒等待获取对象锁的线程,这就是为什么wait(),notify()和notifyAll()方法进入对象类。

2 – wait,notify和notifyAll方法用于线程间通信,它是线程之间的共享对象,从而促进了该通信。
从描述中清楚可见; notify或者notifyAll方法,在被调用时,向在同一对象上等待唤醒的线程发出信号。另一方面,wait()方法发出信号通知持有该锁的线程放弃该对象的锁,以便等待共享对象的另一个线程可以获取该锁。
因此,我们可以看到它是用于通信的共享对象,线程本身并不相互了解。

3 –如果这些方法在Thread类中,则每个线程将必须知道其他每个线程的状态。如果在那种情况下必须调用notify方法,那么当前线程必须对等待线程有确切的了解。
例如,如果当前线程是t1,并且我们需要在线程t2上调用notify,则假定notify方法在Thread类中,则调用将看起来像是thist1.notify(t2)。
然后t1应该知道t2正在等待获取锁。这将使线程间通信变得相当复杂,并且将需要大量状态存储和条件检查。由于锁与对象相关联,因此通过对象进行通信使其非常简单。