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

如何在不是线程的对象上调用wait()和notify()方法?

倪德业
2023-03-14
问题内容

如何在不是线程的对象上调用wait()notify()方法?那真的没有道理,对吗?

当然,这一定是有道理的,因为这两种方法可用于所有Java对象。有人可以提供解释吗?我在理解如何使用wait()和进行线程之间通信时遇到麻烦notify()


问题答案:

锁定是关于保护共享数据。

锁位于要保护的数据结构上。线程是访问数据结构的事物。锁位于数据结构对象上,以防止线程以不安全的方式访问数据结构。

任何对象都可以用作内部锁(与结合使用synchronized)。这样,您可以通过将synced修饰符添加到访问共享数据的方法中来保护对任何对象的访问。

waitnotify方法被称为上正在使用的锁对象。锁是共享的通信点:

  • 当有锁的线程调用notifyAll它时,等待同一锁的其他线程将收到通知。当具有锁的线程调用notify它时,等待同一锁的线程之一将收到通知。

  • 当有锁wait线程调用它时,该线程释放锁并进入休眠状态,直到a)收到通知,或b)任意唤醒(“虚假唤醒”);或者 由于这两个原因之一,等待线程仍停留在调用中,直到它唤醒为止,然后线程必须重新获取锁,然后才能退出wait方法。

请参阅有关受保护块的Oracle教程,Drop类是共享的数据结构,使用Producer和Consumer可运行对象的线程正在访问它。锁定Drop对象将控制线程如何访问Drop对象的数据。

线程在JVM实现中用作锁,建议应用程序开发人员避免将线程用作锁。例如,Thread.join的文档说:

此实现使用以this.isAlive为条件的this.wait调用循环。当线程终止时,将调用this.notifyAll方法。建议应用程序不要在线程实例上使用wait,notify或notifyAll。

Java
5引入了显式锁实现java.util.concurrent.locks.Lock。它们比隐式锁更灵活。有一些类似于等待和通知的方法(等待和信号),但是它们是在Condition而不是在锁上的。具有多个条件使仅针对那些正在等待特定类型通知的线程成为可能。



 类似资料:
  • 本文向大家介绍浅谈线程通信wait,notify作用,包括了浅谈线程通信wait,notify作用的使用技巧和注意事项,需要的朋友参考一下 线程通信的目的是为了能够让线程之间相互发送信号。另外,线程通信还能够使得线程等待其它线程的信号,比如,线程B可以等待线程A的信号,这个信号可以是线程A已经处理完成的信号 Wait()方法 -中断方法的执行,使本线程等待,暂时让出cpu的使用权,并允许其他线程使

  • 我试图做到这一点:创建两个不同的线程,一个打印奇数,一个打印偶数。一旦一个线程打印出一个数字,它就必须等待另一个线程,以此类推,这是一个接一个的。 为了实现这一点,我将使用synchronized block以及wait()和notify()。 我正在创建一个类,该类的对象将用于传递给两个线程中的同步块。 -- --- SyncObject作为参数传递给main中的这些不同线程。 但是,此程序会停

  • 1如题,我知道wait,notify,notifyAll一定要在同步代码块中使用。但我有几个问题: 1.如下,我使用ReentrantLock作为锁,为什么会报错? 然后通过Thread类运行run,为什么会提示关于java.lang.IllegalMonitorStateException错误? 2.我使用Task类里的一个静态字符串变量,比如static String mylock="mylo

  • 问题内容: 我只是很难有时间去了解背后把概念在类。对于这个问题,为了考虑是否和在类。 我的问题是,它可以带来什么变化?在第9行中,我们获取对对象c的锁定,然后执行满足等待条件的等待,该条件是我们需要在使用wait之前获取对对象的锁定的等待条件,对于notifyAll的情况,我们在第31行获取了对Calculator对象的锁定。 问题答案: 我只是很难理解将wait()放在对象类中的概念,出于这个问

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

  • 问题内容: 我正在尝试学习如何在Java中暂停和恢复线程。我使用的是有2个按钮“开始”和“停止”。 线程的运行方法: 现在,每当我尝试暂停或恢复线程时,都会引发异常: 笔记: 如果我使用不推荐使用的方法和,则先前的代码可以完美运行,但是文档指出使用和而不是同步。我尝试将单词添加到方法中,但仍会引发异常。 有人可以解释 为什么 这不起作用以及如何解决同步问题吗?很少有解释要点真的有多大帮助;) 问题