java wait在哪个类_多线程-为什么在Java的Object类中声明wait()和notify()?

多线程-为什么在Java的Object类中声明wait()和notify()?

为什么在Object类而不是Thread类中声明wait()和notify()方法?

9个解决方案

42 votes

因为,您等待给定的对象(或特定地,其监视器)使用此功能。

我认为您可能会误解了这些方法的工作方式。 它们不只是处于线程粒度级别,即不是仅调用wait()并在下一次调用notify()时被唤醒的情况。相反,您始终在特定对象上调用notify(),并且只会被唤醒 在该对象上调用myObj.wait()。

这样做很好,因为否则并发原语就无法扩展。 这将等效于具有全局名称空间,因为在程序中任何位置对notify()的任何调用都可能使任何并发代码混乱,因为它们将唤醒myObj.wait()调用中阻塞的所有线程。 因此,您在特定对象上调用它们的原因; 它为等待通知对提供了运行的上下文,因此,当您在私有对象上调用myObj.notify()时,可以确保只唤醒在类中调用了wait方法的线程。 某些正在等待另一个对象的Spring线程不会被此调用唤醒,反之亦然。

编辑:或者从另一个角度解决它-我希望从您的问题中您认为您将获得等待线程的句柄,并在该线程上调用notify()将其唤醒。 不这样做的原因是,您将不得不自己做很多家务。 要等待的线程将不得不在其他线程可以看到的地方发布对自身的引用。 必须正确同步它以增强一致性和可见性。 而且,当您想唤醒线程时,必须掌握此引用,将其唤醒,然后从任何读取它的位置将其删除。 与仅在睡眠线程中调用myObj.wait(),然后在唤醒线程中调用myObj.notify()相比,涉及更多的手动脚手架,并且出错的可能性更大(尤其是在并发环境中)。

Andrzej Doyle answered 2020-01-10T18:55:47Z

10 votes

最简单,最明显的原因是任何对象(不仅仅是线程)可以是线程的监视器。 等待和通知在监控。 正在运行的线程与监视器进行检查。 所以wait和notify方法在Object而不是Thread中

valli answered 2020-01-10T18:56:08Z

8 votes

因为一次只有一个线程可以拥有一个对象的监视器,而该监视器就是线程正在等待或通知的对象。 如果您阅读了Object.notify()和Object.wait()的javadoc,则会对其进行详细说明。

Taylor Leese answered 2020-01-10T18:56:28Z

1 votes

同步机制涉及一个概念-监视对象。 调用wait()时,将请求监视器,并中止进一步执行,直到获取监视器或发生InterruptedException。 调用notify()时,将释放监视器。

让我们设想一下,如果将wait()和notify()放在Thread类而不是Object类中。 在代码中的一点上,调用currentThread,然后访问对象foo()。

//.........

currentThread.wait();

anObject.setValue(1);

//.........

调用currentThread.wait()时,将请求currentThread的监视器,并且直到获取该监视器或发生InterruptedException为止,都不会进一步执行。 现在,在等待状态下,如果从另一个线程调用驻留在currentThread中的另一个对象anotherObject的方法foo(),即使调用的方法foo()不访问anObject,该方法也会被卡住。如果在anObject上调用了第一个wait()方法,则 对于线程本身,驻留在同一线程中的对象上的其他方法调用(不访问anObject)不会卡住。

因此,在Object类(或其子类)上调用wait()和notify()方法可提供更大的并发性,这就是为什么这些方法在Object类而不是Thread类中的原因。

Programmer in Paradise answered 2020-01-10T18:57:03Z

1 votes

其他一些答案使用“监视”一词,但没有一个解释它的含义。

“监视程序”这个名称最早是在1970年代创造的,它所指的对象具有其自身的固有锁定以及相关的等待/通知机制。 [https://en.wikipedia.org/wiki/Monitor_%28synchronization%29]

二十年后的短时间内,台式机,多处理器计算机的出现是一种新颖的现象,时髦的想法是为它们设计软件的正确方法是创建面向对象的程序,其中每个对象都是一个对象。 监控。

事实证明这并不是一个有用的想法,但是那一刻恰好是发明Java编程语言的那一刻。

Solomon Slow answered 2020-01-10T18:57:37Z

0 votes

请在此处阅读有关等待通知的说明。

但是最好在应用程序中避免这些,并使用更新的java.util.concurrent包。

kgiannakakis answered 2020-01-10T18:58:01Z

0 votes

我将以一种简单的方式进行说明:

要调用wait()或notify(),您需要拥有对象监视器-这意味着wait()或notify()必须存在于同步块中

synchronized(monitorObj){

monitorObj.wait() or even notify

}

这就是这些方法出现在对象类中的原因

Prabakaran Natarajan answered 2020-01-10T18:58:30Z

0 votes

这是因为这些方法用于线程间通信,并且线程间通信通过使用锁发生,但是锁与对象相关联。因此它在对象类中。

Sandeep answered 2020-01-10T18:58:50Z

0 votes

Wait和Notify方法用于Java中两个线程之间的通信。 因此,Object类是使它们可用于Java中的每个对象的正确位置。

另一个原因是每个对象都可以使用锁。 线程需要锁,并且它们等待锁,他们不知道哪个线程持有锁,而只是知道某个线程持有该锁,因此应该等待锁,而不是知道哪个线程位于同步块中,并要求它们释放 锁

Anil Satija answered 2020-01-10T18:59:15Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值