你是如何使用 wait () 方法的?使用 if 还是 while

Hi 大家好,我是 DHL,大厂程序员,公众号:ByteCode ,在美团、快手、小米工作过。搞过逆向,做过性能优化,研究过系统,擅长鸿蒙、Android、Kotlin、性能优化、职场分享。

微信小程序「猿面试」每日分享一道大厂面试题,涉及 JavaAndroid鸿蒙和ArkTS设计模式算法和数据结构 等内容。


你是如何使用 wait () 方法的?使用 if 还是 while

在 Java 中,wait() 方法通常与 synchronized 关键字一起使用,以确保线程之间的正确同步。wait() 方法使当前线程进入等待状态,直到其他线程调用 notify()notifyAll() 方法来唤醒它。

在 Java 并发编程中,wait() 方法通常放在 while 循环中而不是 if 语句中,这种做法主要是为了解决下面的问题:

  • 防止虚假唤醒
  • 确保线程被唤醒时满足条件,避免因条件变化导致线程继续执行错误的操作

什么是虚假唤醒(spurious wakeups)

虚假唤醒是指线程在没有被显式唤醒(例如通过 notify()notifyAll())的情况下,仍然从 wait() 状态中恢复执行的现象。

这种情况可能因为操作系统的线程调度或其他线程的干扰而发生。如果 wait() 方法放在 if 语句中,一旦线程被虚假唤醒,它可能会在没有获得锁的情况下退出循环,从而导致程序逻辑错误。

使用 while 循环的原因

防止虚假唤醒

Java 中的 wait() 方法可能会出现“虚假唤醒”现象,即线程在没有被其他线程调用 notify()notifyAll() 的情况下被唤醒,如果不在循环中检查等待条件,程序就会在没有满足结束条件的情况下退出。

为了避免这种情况,可以将 wait() 放在 while 循环中,每次从 wait() 方法返回后,都需要重新检查条件是否满足,这样可以确保线程在等待条件未满足前,会持续等待。

即使线程因为虚假唤醒而提前醒来,循环会继续检查条件,如果条件不满足,线程会再次调用 wait() 方法,从而避免虚假唤醒对程序逻辑的影响。

使用 while 循环可以确保在每次从 wait() 方法返回后,都会重新检查条件是否满足,从而避免因虚假唤醒而导致的错误。以下是一个典型的使用场景:

synchronized (monitor) {
    while (!condition) {
        try {
            monitor.wait();
        } catch (InterruptedException e) {
            
        }
    }
    
}

在这个例子中,monitor 是一个对象,condition 是一个布尔条件。

线程在进入 synchronized 块后,会检查 condition 是否为 true。如果条件不满足,线程会调用 monitor.wait() 进入等待状态,并释放锁。

当其他线程调用 monitor.notify()monitor.notifyAll() 时,等待的线程会被唤醒,并重新进入 synchronized 块。此时,线程会再次检查 condition,只有在条件满足的情况下才会继续执行。

确保条件满足

当线程被唤醒时,它需要重新检查等待的条件是否仍然满足。如果条件不满足,线程应该再次进入等待状态。

通过在 while 循环中调用 wait(),可以确保线程在每次唤醒后都重新检查条件,从而避免因条件变化而导致的错误行为。

避免条件变化

在多线程环境中,其他线程可能会在当前线程进入等待状态后修改条件。如果 wait() 方法放在 if 语句中,当线程被唤醒时,可能无法及时检测到条件的变化,从而导致线程继续执行错误的操作。

更多大厂面试题,欢迎前往微信搜索小程序 「猿面试」 查看。微信小程序 (猿面试) 包含了 Java、Android、鸿蒙和ArkTS设计模式算法和数据结构 相关内容,

Hi 大家好,我是 DHL,大厂程序员,公众号:ByteCode ,在美团、快手、小米工作过。搞过逆向,做过性能优化,研究过系统,擅长鸿蒙、Android、Kotlin、性能优化、职场分享。

更多面试题

阅读全文
下载说明:
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.dandroid.cn/archives/22544,转载请注明出处。
0

评论0

显示验证码
没有账号?注册  忘记密码?