gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:29:15 27 4
gpt4 key购买 nike

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

最佳答案

因为,您要等待给定的对象(或具体来说,它的监视器)才能使用此功能。

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

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

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

关于java - 为什么在 Java 的 Object 类中声明 wait() 和 notify()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1769489/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com