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

java:wait(),notify()和同步块

乐正宏深
2023-03-14
问题内容

我了解到,调用对象的wait()方法将释放对象监视器(如果存在)。

但是我notify()对通过另一个线程调用该对象有一些疑问:

  1. (何时)等待线程唤醒,如果同时有另一个(第3个)线程拥有对象监视器?

  2. 如果wait()在该对象上调用了第三个线程,等待线程将被唤醒吗?

  3. 是否可以确定线程是否正在等待通知特定对象(java 1.4 / java 5)

  4. 如果wait()将在finalize()方法中调用会发生什么情况?


问题答案:
  1. notify将唤醒在监视器上等待的一个线程。除非并且直到监视器是无主的,否则没有线程等待可以运行;必须在同步块中调用wait(),因此必须持有该锁才能继续运行该块。
  2. 没有保证。调用notifyAll使所有线程有 机会 唤醒。
  3. 不知道。您可以让线程设置一个变量,说它在进入睡眠之前正在等待…
  4. 这可能是一个坏主意。您能否提出需要这样做的情况?


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

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

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

  • Java中,任何对象都可以作为锁,并且 wait(),notify()等方法用于等待对象的锁或者唤醒线程,在 Java 的线程中并没有可供任何对象使用的锁,所以任意对象调用方法一定定义在Object类中。 wait(), notify()和 notifyAll()这些方法在同步代码块中调用 有的人会说,既然是线程放弃对象锁,那也可以把wait()定义在Thread类里面啊,新定义的线程继承于Thr

  • 问题内容: 我是在Java中使用wait()和notify()的新手,并且遇到了IllegalMonitorStateException。 主要代号 我收到一个IllegalMonitorStateException,称为state.notify()。有任何想法吗? 编辑 :根据下面的答案是有效的代码。作为附带说明,我首先尝试使用与使用Integer相同的问题的枚举进行此操作。 问题答案: 这个

  • 我有个问题。当我在synchronized块中使用时,我有IllegalMonitorStateException。有谁能帮我解决这个问题吗? 我必须这样做,一个线程将发送到第二个线程char,然后这个线程必须等待和第二个线程打印这个char。在第二个线程等待之后,第一个线程再次发送下一个字符 main.java: