news 2026/4/23 16:21:40

“为什么wait和notify必须在同步块中调用?Java面试必看!”

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
“为什么wait和notify必须在同步块中调用?Java面试必看!”

文章目录

  • 为什么 wait 和 notify 必须在同步块中调用?Java 面试必看!
    • 1. 故事引入:线程世界的“监狱”与“通风口”
    • 2. 理论基础:Java 内存模型中的“锁”机制
      • 2.1 对象监视器:同步块的“灵魂”
      • 2.2 wait() 和 notify() 的作用
    • 3. 实践示例:代码中的“坑”与“避坑指南”
      • 3.1 错误示例:在同步块外调用 wait()
      • 3.2 正确示例:在同步块内使用 wait() 和 notify()
    • 4. 扩展讨论:为什么要有这些限制?
      • 4.1 防止竞争条件(Race Condition)
      • 4.2 确保线程安全
    • 5. 总结:闫工的“心灵鸡汤”
    • 如果觉得这篇文章对你有帮助,欢迎点赞、收藏、分享!咱们下期再见,继续探索 Java 的奇妙世界!
      • 📚 领取 | 1000+ 套高质量面试题大合集(无套路,闫工带你飞一把)!

为什么 wait 和 notify 必须在同步块中调用?Java 面试必看!

大家好,我是你们的老朋友闫工!今天咱们要聊一个 Java 多线程编程中的经典问题:为什么wait()notify()必须在同步块中调用?这是一个面试中经常被问到的问题,也是理解 Java 并发机制的重要知识点。废话不多说,咱们直接进入主题!


1. 故事引入:线程世界的“监狱”与“通风口”

假设你正在编写一个多线程程序,两个线程像一对“双胞胎兄弟”,一个负责生产数据,另一个负责消费数据。为了防止“虚假唤醒”(比如生产者还没准备好数据,消费者就急着去取),你需要使用wait()notify()来协调它们的工作。

但是,如果你不小心把wait()notify()调用在同步块之外,程序就会抛出一个IllegalMonitorStateException异常。这让你的程序“死不瞑目”,直接挂掉。那么,为什么这两个方法这么“娇气”呢?

我来给你讲个故事:线程的世界里有一个“监狱”,这个监狱就是同步块synchronized)。每个线程在进入监狱之前,必须先获得一个钥匙(即锁),否则它就不能进入监狱。而wait()notify()就是监狱里的两个“通风口”——只有在监狱里的线程才能使用它们。

简单来说,wait()是让当前线程暂时离开监狱的“监房”,去外面的“休息室”(等待队列)里睡一觉;而notify()则是叫醒一个在休息室里的线程,让它回到监房继续工作。但如果你不进入监狱就直接操作这两个通风口,那就会出问题!因为没有钥匙,你根本进不去监狱,自然无法使用里面的设施。


2. 理论基础:Java 内存模型中的“锁”机制

在 Java 中,wait()notify()Object 类的方法。它们只能被拥有对象监视器(即锁)的线程调用。换句话说,只有在线程获取了某个对象的锁之后,才能使用这两个方法。

2.1 对象监视器:同步块的“灵魂”

每个 Java 对象都有一个与之关联的监视器(monitor)。当线程进入synchronized同步块时,它就会尝试获得该对象的监视器。如果成功获得锁,线程就可以执行同步块中的代码;否则,它会进入等待状态,直到拿到锁为止。

简单来说,synchronized关键字的作用就是控制对共享资源的访问权限,确保同一时间只有一个线程可以操作这些资源。而wait()notify()就是这个机制中的两个“开关”,用于在多线程之间进行更精细的协调。

2.2 wait() 和 notify() 的作用

  • wait():让当前线程放弃对对象监视器的所有权,并进入等待状态。它会释放锁,直到被notify()notifyAll()唤醒。
  • notify():唤醒一个在等待队列中的线程,让它重新竞争锁。

如果没有同步块(即没有获得对象监视器),那么调用wait()notify()就会导致IllegalMonitorStateException异常。因为这两个方法必须依赖于某个具体的对象监视器,而只有在线程持有该对象的锁时才能使用它们。


3. 实践示例:代码中的“坑”与“避坑指南”

为了更直观地理解这个问题,咱们来看几个实际的代码例子。

3.1 错误示例:在同步块外调用 wait()

publicclassTest{publicstaticvoidmain(String[]args){Threadt=newThread(()->{// 没有 synchronized 块,直接调用 wait()try{Objectlock=newObject();lock.wait();// 这里会抛出 IllegalMonitorStateException}catch(InterruptedExceptione){e.printStackTrace();}});t.start();}}

运行这个程序,你会看到一个异常:IllegalMonitorStateException。因为lock对象的监视器没有被当前线程持有(即线程没有进入同步块),所以直接调用wait()是不允许的。

3.2 正确示例:在同步块内使用 wait() 和 notify()

publicclassTest{privatestaticObjectlock=newObject();publicstaticvoidmain(String[]args){Threadproducer=newThread(()->{synchronized(lock){// 进入同步块,获得锁System.out.println("生产者开始生产数据...");try{lock.notify();// 唤醒消费者线程lock.wait();// 生产完成后,等待消费者的回应}catch(InterruptedExceptione){e.printStackTrace();}}});Threadconsumer=newThread(()->{synchronized(lock){// 进入同步块,获得锁try{System.out.println("消费者开始等待数据...");lock.wait();// 等待生产者的通知System.out.println("收到通知,开始消费数据...");lock.notify();// 通知生产者继续生产}catch(InterruptedExceptione){e.printStackTrace();}}});producer.start();consumer.start();}}

这个程序中,两个线程都通过synchronized关键字进入了同步块,并且使用了同一个lock对象作为监视器。这样就确保了wait()notify()的调用是合法的。


4. 扩展讨论:为什么要有这些限制?

4.1 防止竞争条件(Race Condition)

如果没有同步块的保护,多个线程可能同时操作共享资源,导致数据不一致或程序逻辑出错。wait()notify()的存在,就是为了帮助开发者更优雅地管理多线程之间的协作。

4.2 确保线程安全

同步块的作用不仅仅是控制并发访问,还为线程提供了“可见性”保证(即一个线程对共享变量的修改会立即被其他线程看到)。而wait()notify()的使用,必须依赖于这种可见性保证。


5. 总结:闫工的“心灵鸡汤”

通过今天的讲解,希望大家对wait()notify()的使用有了更深入的理解。记住:它们是同步块中的好帮手,而不是独立的操作工具!只有在线程持有锁的情况下,才能调用这两个方法,否则就会出错。

最后,闫工送大家一句话:“多线程的世界很精彩,但规矩必须记心间!”

如果觉得这篇文章对你有帮助,欢迎点赞、收藏、分享!咱们下期再见,继续探索 Java 的奇妙世界!

📚 领取 | 1000+ 套高质量面试题大合集(无套路,闫工带你飞一把)!

成体系的面试题,无论你是大佬还是小白,都需要一套JAVA体系的面试题,我已经上岸了!你也想上岸吗?

闫工精心准备了程序准备面试?想系统提升技术实力?闫工精心整理了1000+ 套涵盖前端、后端、算法、数据库、操作系统、网络、设计模式等方向的面试真题 + 详细解析,并附赠高频考点总结、简历模板、面经合集等实用资料!

✅ 覆盖大厂高频题型
✅ 按知识点分类,查漏补缺超方便
✅ 持续更新,助你拿下心仪 Offer!

📥免费领取👉 点击这里获取资料

已帮助数千位开发者成功上岸,下一个就是你!✨

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 12:29:31

AI率在哪查?如何降ai率?有哪些免费降aigc工具?

这两年毕业,ai率成为了一项非常重要的指标。 随着《学位法》正式施行,“人工智能写作”已被明确列为学术不端。 现在的毕业流程,不仅要看查重率,还要强行附带AIGC检测报告。如果AI率过高,轻则退回重改,重则…

作者头像 李华
网站建设 2026/4/23 15:25:40

2026年权威查ai率渠道、降ai率工具大汇总【建议收藏】

这两年毕业的同学们得注意了,《学位法》明确将“人工智能写作”列为学术不端。 现在的毕业流程,不仅要看查重率,还要强行附带AIGC检测报告。如果AI率过高,轻则退回重改,重则影响学位。 市面上降ai、查ai的工具都非常多…

作者头像 李华
网站建设 2026/4/23 12:29:42

域名交易遇到纠纷怎么办?常见解决思路

在域名交易过程中,无论是新手还是有经验的买卖双方,都有可能遇到纠纷。常见问题包括款项未到账、域名未按约定过户、交易条件理解不一致等。如果处理不当,不仅影响交易体验,甚至可能造成实际损失。那么,当域名交易真的…

作者头像 李华
网站建设 2026/4/23 11:29:40

拆解Mate X7的“超可靠折叠玄武架构”:从内到外全身都很“硬”!

相信很多人在选择折叠屏手机前,最纠结的往往不是价格,而是怕它“不耐用”——担心屏幕脆弱、铰链易坏,使用起来小心翼翼。而华为最新的Mate X7,目标就是打破这一刻板印象,在“超可靠折叠玄武架构”的防护体系下&#x…

作者头像 李华
网站建设 2026/4/23 5:08:40

22、多媒体与网络通信实用指南

多媒体与网络通信实用指南 1. 多媒体使用 1.1 网络电台收听 很多人喜欢在工作时听音乐或其他声音。除了播放CD,还能通过网络电台在电脑上收听广播。如今有数千个网络电台可供选择,部分电台需要Windows Media Player,但并非全部。许多广播采用MP3格式,支持MP3的音频播放器…

作者头像 李华
网站建设 2026/4/23 11:34:30

【数据分享】1942-2024年全国观测站点逐日气象指标数据

本文分享一份全国气象数据,涵盖气温、风速、降水、能见度等关键指标,是众多研究领域不可或缺的基础资料。这些数据由美国国家海洋和大气管理局(NOAA)旗下的国家环境信息中心(NCEI)权威发布。整理了1942-202…

作者头像 李华