迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

Java中为什么wait,notify 和 notifyAll 在同步块或方法中调用

作者:迹忆客 最近更新:2023/05/09 浏览次数:

大多数 Java 开发人员都知道对象类的 wait()notify()notifyAll() 方法必须在 Java 中的同步方法或同步块中调用,但我们想过多少次这是为什么? 最近这个问题在 Java 面试中被问到我的一个朋友,他沉思了一下并回答说如果我们不从同步上下文调用 wait()notify() 方法,我们将在 Java 中收到 IllegalMonitorStateException。 就语言行为而言,他是对的,但根据他的说法,面试官对答案并不完全满意,想向他解释更多。

面试结束后,他和我讨论了同样的问题,我认为他应该告诉面试官关于 Java 中 wait()notify() 之间的竞争条件,如果我们不在同步方法或块中调用它们,它们可能存在。 让我们看看它是如何在 Java 程序中发生的。

这也是流行的线程面试问题之一,在 Java 开发人员的面试中经常被问到。 所以,如果你正在准备 Java 面试,你应该准备这样的问题,


为什么 wait()、notify() 和 notifyAll() 必须从 Java 中的同步块或方法中调用

我们主要使用 wait()notify()notifyAll() 方法来进行 Java 中的线程间通信。 一个线程在检查条件后等待,例如 在经典的 Producer-Consumer 问题中,如果缓冲区已满,生产者线程将等待,并且消费者线程在通过消耗元素在缓冲区中创建空间后通知生产者线程。

调用 notify()notifyAll() 方法向单个或多个线程发出条件已更改的通知,一旦通知线程离开同步块,所有正在等待的线程都会争夺它们正在等待的对象锁,并且 幸运线程在重新获取锁后从 wait() 方法返回并继续进行。

让我们将整个操作分成几个步骤来查看 Java 中 wait()notify() 方法之间竞争条件的可能性,我们将使用 Produce Consumer 线程示例来更好地理解该场景:

  1. Producer 线程测试条件(buffer是否满),确认必须等待(发现buffer满后)。
  2. Consumer 线程在使用缓冲区中的元素后设置条件。
  3. Consumer 线程调用 notify() 方法; 这是闻所未闻的,因为生产者线程尚未等待。
  4. Producer 线程调用 wait()方法,进入等待状态。

因此,由于这里的竞争条件,我们可能会丢失通知,如果我们使用缓冲区或仅使用一个元素,Produce 线程将永远等待,我们的程序将挂起。

 

Java 并发 wait 和 notify
Java 并发 wait 和 notify

 

现在让我们考虑如何解决这种潜在的竞争条件? 这种竞争条件通过使用 synchronized 关键字和 Java 提供的锁来解决。 为了调用 Java 中的 wait()notify()notifyAll() 方法,我们必须已经获得调用方法的对象的锁。

由于 Java 中的 wait() 方法也会在等待之前释放锁并在从 wait() 方法返回之前重新获取锁,因此我们必须使用此锁来确保检查条件(缓冲区是否已满)并设置 条件(从缓冲区中获取元素)是原子的,这可以通过在 Java 中使用同步方法或块来实现。

我不确定这是否是面试官真正期望的,但我认为这至少是有道理的,如果我错了请纠正我,请告诉我们是否还有其他令人信服的调用 wait()notify() 的理由 ,或 Java 中的 notifyAll 方法。

总结一下,我们从 Java 中的同步方法或同步块调用 Java 中的 wait()notify()notifyAll 方法以避免:

  1. Java中的 IllegalMonitorStateException 如果我们不从同步上下文中调用 wait()notify()notifyAll()方法就会发生。
  2. Java 中 waitnotify 方法之间的任何潜在竞争条件。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Do you understand JavaScript closures?

发布时间:2025/02/21 浏览次数:108 分类:JavaScript

The function of a closure can be inferred from its name, suggesting that it is related to the concept of scope. A closure itself is a core concept in JavaScript, and being a core concept, it is naturally also a difficult one.

Do you know about the hidden traps in variables in JavaScript?

发布时间:2025/02/21 浏览次数:178 分类:JavaScript

Whether you're just starting to learn JavaScript or have been using it for a long time, I believe you'll encounter some traps related to JavaScript variable scope. The goal is to identify these traps before you fall into them, in order to av

How much do you know about the Prototype Chain?

发布时间:2025/02/21 浏览次数:150 分类:JavaScript

The prototype chain can be considered one of the core features of JavaScript, and certainly one of its more challenging aspects. If you've learned other object-oriented programming languages, you may find it somewhat confusing when you start

JavaScript POST

发布时间:2024/03/23 浏览次数:96 分类:JavaScript

本教程讲解如何在不使用 JavaScript 表单的情况下发送 POST 数据。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便