当前位置: 首页 > 面试题库 >

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

侯向文
2023-04-24

Java中,任何对象都可以作为锁,并且 wait(),notify()等方法用于等待对象的锁或者唤醒线程,在 Java 的线程中并没有可供任何对象使用的锁,所以任意对象调用方法一定定义在Object类中。

wait(), notify()和 notifyAll()这些方法在同步代码块中调用

有的人会说,既然是线程放弃对象锁,那也可以把wait()定义在Thread类里面啊,新定义的线程继承于Thread类,也不需要重新定义wait()方法的实现。然而,这样做有一个非常大的问题,一个线程完全可以持有很多锁,你一个线程放弃锁的时候,到底要放弃哪个锁?当然了,这种设计并不是不能实现,只是管理起来更加复杂。

综上所述,wait()、notify()和notifyAll()方法要定义在Object类中。

 类似资料:
  • 问题内容: 我们都知道,为了调用,必须将此调用放置在同步块中,否则将引发。但是,进行此限制的原因是什么?我知道这释放了监视器,但是为什么我们需要通过使特定的块同步来显式获取监视器,然后通过调用来释放监视器? 如果可以在同步块之外调用并保留其语义-挂起调用者线程,可能造成什么损害? 问题答案: 只有在还存在时,才有意义,因此它始终与线程之间的通信有关,并且需要同步才能正常工作。有人可能会争辩说这应该

  • 问题内容: 我正在尝试检查java中的wait / notify如何工作。 码: 输出返回 我期望在执行notify()时,等待将结束并被打印。但似乎只有完成打印后才能打印。 问题答案: 对象监视器锁需要执行相同锁的单个引用。 在你的榜样,你是对的一个实例,但使用从。相反,您应该使用单个通用锁定对象…例如 输出… 并可能根据线程调度更改位置。 您可以尝试将睡眠排除在障碍之外。这将释放监视器锁定,从

  • 我正在学习 处等待(由于< code > synchronized ,它从未进入其代码块)。一旦生产者线程退出它的同步代码块,消费者线程将进入它的。现在,队列是非空的,因为生产者只是在通知之前放了一些东西进去。消费者线程将移除它,调用notify,退出它的块,此时生产者将获得锁,因为它现在已经在生产者函数中的< code>synchronized(lock)行等待。三个问题: > < li> 在我

  • 问题内容: 我一直在考虑向Java语言架构师发送建议。 在同步块中 在线程离开同步块之后,它不能再调用lock.notifyAll()/ lock.notify()而不会发生异常。 忘记通知其他线程监视器持有者可能永远使他们(其他线程)等待(除非他们在其wait方法中放置了一些超时)。 我无法想象这种情况(在没有显式通知的情况下在同步块的末尾插入隐式通知)是不理想的。 相同的方法可以应用于同步方法

  • 问题内容: 我了解到,调用对象的方法将释放对象监视器(如果存在)。 但是我对通过另一个线程调用该对象有一些疑问: (何时)等待线程唤醒,如果同时有另一个(第3个)线程拥有对象监视器? 如果在该对象上调用了第三个线程,等待线程将被唤醒吗? 是否可以确定线程是否正在等待通知特定对象(java 1.4 / java 5) 如果将在方法中调用会发生什么情况? 问题答案: 将唤醒在监视器上等待的一个线程。除

  • 问题内容: Java中的同步方法和同步块有什么区别? 我一直在网上搜索答案,人们似乎对此不太确定:-( 我的看法是,两者之间没有区别,只是synch块的作用域可能更多,因此锁定的时间更少了? 如果在静态方法上使用Lock,则采用什么Lock?班级锁是什么意思? 问题答案: 同步方法将方法接收器用作锁(即,用于非静态方法,而用于静态方法的封闭类)。 blocks将表达式用作锁。 因此,以下两种方法等