当前位置:

首页 > 编程开发 > 怎么通过 Object 类的 wait/notify 机制在面向对象层面实现初级的线程间协作

怎么通过 Object 类的 wait/notify 机制在面向对象层面实现初级的线程间协作

Air Explorer Pro
Air Explorer Pro

Air Explorer Pro是一款跨平台多网盘管理工具,可实现一站式完成不同网盘间文件的互传、搜索和同步等操作。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

立即下载
¥99
Windows/macOS 2026-08-22
正版软件 Windows macOS软件 Pro 文件搜索工具 Pro下载 Pro正版软件 Pro购买

怎么通过 Object 类的 wait/notify 机制在面向对象层面实现初级的线程间协作 在Ja va多线程编程里,让线程之间有序协作,而不是乱成一锅粥,是个基本功。Object 类提供的 wait() 和 notify()(以及它的兄弟 notifyAll())方法,正是实现这种“等待-唤醒”

怎么通过 Object 类的 wait/notify 机制在面向对象层面实现初级的线程间协作

怎么通过 Object 类的 wait/notify 机制在面向对象层面实现初级的线程间协作

在Ja va多线程编程里,让线程之间有序协作,而不是乱成一锅粥,是个基本功。Object 类提供的 wait() 和 notify()(以及它的兄弟 notifyAll())方法,正是实现这种“等待-唤醒”契约的核心工具。简单来说,就是让一个线程在条件不满足时先“歇着”,等另一个线程准备好后再把它“叫醒”。

但这里有个铁律,必须牢记:所有对 wait 和 notify 的调用,都必须老老实实地放在 synchronized 同步块里,而且锁对象,必须就是调用这些方法的那个对象本身。这是整个机制能安全运转的基石。

共享状态对象作为协作枢纽

怎么理解这个“契约”呢?关键在于,要有一个共享的状态对象。你可以定义一个普通的Ja va类,比如叫 TaskQueue,用它来封装需要协作的业务状态——比如任务列表是不是空了,或者计算结果有没有准备好。这个对象身兼三职:它是数据的载体,是同步用的锁,更是线程间通信的“信号灯”。

  • 线程A想调用 queue.wait() 去等待,前提是它必须先拿到 queue 这把锁(也就是进入 synchronized(queue) 块)。一旦调用 wait(),它就会释放锁,然后乖乖进入等待队列,直到被唤醒。
  • 线程B在修改了共享状态(比如往队列里加了新任务)之后,同样需要在 synchronized(queue) 块里,调用 queue.notify() 或 queue.notifyAll() 来发出信号。
  • 被唤醒的线程(比如刚才的线程A)会重新加入竞争,去抢 queue 的锁。抢到之后,它才能从 wait() 的地方继续执行。这里有个至关重要的细节:醒来后第一件事,应该是重新检查等待条件是否真的满足了。

必须配合 while 循环做条件重检

为什么必须重新检查?因为 wait() 存在“虚假唤醒”的可能性——线程可能因为某些与业务逻辑无关的原因(比如操作系统信号干扰)而被唤醒。所以,绝对不能简单地用 if 判断一次就了事,必须用 while 循环把等待条件包起来:

synchronized (sharedObj) {
  while (!conditionMet()) { // 用while,不是if!
    sharedObj.wait();
  }
  // 执行到这里时,conditionMet() 肯定为 true了,可以安全地处理后续逻辑
}

举个典型的例子,在生产者-消费者模型里,消费者线程能行动的前提是“队列非空”。所以,它的等待逻辑必须是 while(!queue.isEmpty()) wait(); —— 即使被唤醒了,也得再瞅一眼队列,确认真的有东西可消费才行。

notify 与 notifyAll 的选择依据

那么,叫醒一个线程,是用 notify() 还是 notifyAll() 呢?这得看场景。

  • notify() 会随机唤醒等待在同一个对象上的一个线程。它适合条件单一、等待方角色明确的场景,比如两个线程严格交替执行。
  • notifyAll() 则更“豪爽”,它会唤醒所有正在等待的线程。这种方式更安全、更通用,尤其是在多个线程等待不同条件(比如有的在等“非空”,有的在等“未满”)的复杂场景下。唤醒后,让每个线程自己用 while 循环去判断是否满足了自己的条件,满足的就继续执行,不满足的继续等待。

对于初学者来说,有个实用的建议:如果不确定该用哪个,那就统一使用 notifyAll()。虽然可能带来一点点性能开销,但它能有效避免因唤醒错对象而导致的死锁风险。当然,如果你能百分之百确定,只有一类线程在等待某个条件,并且你一旦唤醒它,条件肯定满足,那么用 notify() 会更轻量一些。

典型协作模式示例:简单阻塞队列

理论说了这么多,来看一个最经典的“生产一个,消费一个”的协作模式,思路就非常清晰了:

  • 生产者线程的行动路线是:获取锁 → 检查队列是否已满(用while循环判断)→ 如果满了就 wait() → 添加元素 → 调用 notifyAll() → 释放锁。
  • 消费者线程的行动路线是:获取锁 → 检查队列是否为空(同样用while循环判断)→ 如果空了就 wait() → 取出元素 → 调用 notifyAll() → 释放锁。

这个模式里的关键点有两个:一是双方都在修改完共享状态后、离开同步块前调用 notifyAll();二是双方都坚持用 while 循环来重新检查等待条件。把握住这两点,一个基础的线程协作框架就搭建起来了。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发 AI
相关文章 更多
AI重构企业业务架构:超聚变“智企”范式核心解析
AI重构企业业务架构:超聚变“智企”范式核心解析

本文解析超聚变在2026数博会发布的“智企”范式,重点阐述如何通过Token生产平台(Token Factory)与企业业务本体建模,实现从简单AI工具调用到企业应用架构系统性重构的演进。文章详细拆解了智能体编排、数字孪生及生态协同等关键技术路径,为AI时代企业数字化转型提供可落地的参考方案。

微软推出Project Zenith:面向Windows 11开发者的AI硬件加速方案
微软推出Project Zenith:面向Windows 11开发者的AI硬件加速方案

微软于9月5日推出Project Zenith,旨在为Windows 11开发者提供更高效的AI开发体验。该项目目前仅支持配备超过64GB统一内存及250GB/s内存带宽的特定硬件,首发适配AMD Ryzen AI Halo设备。通过此项目,开发者可在本地运行参数超过300亿的AI模型,后续将分阶段扩展至更多合作伙伴设备。

习惯Office转WPS要多久?双生态兼容与无缝切换指南
习惯Office转WPS要多久?双生态兼容与无缝切换指南

从Office转向WPS的核心操作肌肉记忆切换通常需3至7天,不影响正常办公。适应期长短取决于界面视觉差异与专属格式配置。通过切换“经典界面”、嵌入字体及开启云同步,可实现平滑过渡。本文详解格式兼容、数据迁移及AI功能适用场景,适用于需多端协同、成本控制及国产化兼容的办公人群。

专家:AI聊天不能越界成“精神依赖”|科技观察
专家:AI聊天不能越界成“精神依赖”|科技观察

加拿大一母亲起诉OpenAI,称ChatGPT设计缺陷导致其女儿自杀,指控其优先用户参与度而非安全性,持续提供情感支持致过度依赖。专家指出AI应“陪伴但不过界”,需设定边界并引导求助。国家已出台拟人化互动服务管理办法。

未上真车,AI先当教练!2026届高考生,将成为首批“原生AI司机”?
未上真车,AI先当教练!2026届高考生,将成为首批“原生AI司机”?

2026届高考生学车时多采用AI教练,逐步适应人机共驾。作为与生成式AI共同成长的一代,他们更易接受智能驾驶,未来可能成为首批“原生AI司机”。至2030年前后,其人生首辆车或具备L3级自动驾驶能力,驾驶角色将从操控者转向监督者。

AI热潮来袭,何去何从?别被“错失恐惧症”裹挟!
AI热潮来袭,何去何从?别被“错失恐惧症”裹挟!

全球股市因AI热潮呈现K型分化,半导体板块估值逼近百倍市盈率。历史警示:2000年互联网泡沫中的“四骑士”最终市值暴跌或长期盘整。投资者应警惕“错失恐惧症”,重视安全边际、护城河与能力圈,避免被高估值裹挟,关注稳健性与股息率。

报告:背负技术债的企业更难从 AI 应用中获益
报告:背负技术债的企业更难从 AI 应用中获益

Cloudflare报告显示,完成应用现代化的企业从AI投资中获得可衡量回报的概率是未现代化企业的三倍。93%的决策者视系统更新为AI先决条件,91%的领先企业已嵌入AI功能。安全与现代化协同推进可使AI成熟度提升四倍,精简技术架构成为竞争力分水岭。

微软称保守假设下,典型AI查询耗水量少于1滴水
微软称保守假设下,典型AI查询耗水量少于1滴水

据微软引用《Joule》期刊的一项研究指出,每一次典型人工智能查询耗电量零点一六至零点六零瓦时,其冷却用水量中位数不足一滴水。大规模部署下,单位查询的效率会更高,总能耗可以降低一半以上。

A股异动丨PCB概念掀涨停潮,大摩称AI光模块PCB三年迎5倍增长
A股异动丨PCB概念掀涨停潮,大摩称AI光模块PCB三年迎5倍增长

A股PCB概念板块掀起涨停潮,因摩根士丹利报告预测AI光模块PCB市场三年增长超5倍,2025至2028年规模从6.2亿美元增至37.7亿美元,年复合增速高达83%,远超光模块整体增速。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
Postman macOS版
Postman macOS版
Mac

Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。

Docker Desktop macOS版
Docker Desktop macOS版
Mac

Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。

Android Studio macOS版
Android Studio macOS版
Mac

Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。

WINDOWS 更多
PixPix 网页版
PixPix 网页版
Windows

PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。

Postman Windows版
Postman Windows版
Windows

Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等

Docker Desktop Windows版
Docker Desktop Windows版
Windows

Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。

即将离开本站
您即将前往第三方网站,请确认是否继续?