首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么在Java的Object类中声明wait()和notify()?

为什么在Java的Object类中声明wait()和notify()?
EN

Stack Overflow用户
提问于 2009-11-20 18:01:41
回答 7查看 23K关注 0票数 55

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

EN

回答 7

Stack Overflow用户

发布于 2009-11-20 18:13:15

最简单和最明显的原因是,任何对象(不仅仅是线程)都可以作为线程的监视器。等待和通知是在监视器上调用的。正在运行的线程检查监视器。因此,等待和通知方法位于Object中,而不是Thread中

票数 11
EN

Stack Overflow用户

发布于 2009-11-20 18:11:56

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

票数 8
EN

Stack Overflow用户

发布于 2009-11-20 20:06:27

同步机制涉及到对象的概念监视器。当调用wait()时,将请求监视器,并挂起进一步的执行,直到获得监视器或发生InterruptedException。当notify()被调用时,监控器被释放。

让我们来看一个场景,如果wait()和notify()被放在Thread类而不是Object类中。在代码中的某一点上,调用currentThread.wait(),然后访问对象anObject

代码语言:javascript
复制
//.........
currentThread.wait();
anObject.setValue(1);
//.........

当调用currentThread.wait()时,将请求currentThread的监视器,并且在获取监视器或发生InterruptedException之前不会执行进一步的操作。现在处于等待状态,如果从另一个线程调用驻留在currentThread中的另一个对象anotherObject的方法foo(),即使被调用的方法foo()不访问anObject,它也会被卡住。如果第一个wait()方法是在anObject上调用的,而不是线程本身,那么驻留在同一线程中的对象上的其他方法调用(不访问anObject)就不会被卡住。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1769489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档