Java 中 Object.wait() 的底层 native 实现源码解析

千婷酱_4710

千婷酱_4710

2026-11-12

277人浏览

原创

Java 中 Object.wait() 的底层 native 实现源码解析

本文详细梳理了 Java Object.wait() 方法所依赖的 wait0() 本地方法在 OpenJDK HotSpot 虚拟机中的完整调用链与源码位置,涵盖从 Java 层到 C++ 同步机制的核心实现路径。

本文详细梳理了 java `object.wait()` 方法所依赖的 `wait0()` 本地方法在 openjdk hotspot 虚拟机中的完整调用链与源码位置,涵盖从 java 层到 c++ 同步机制的核心实现路径。

在 Java 并发编程中,Object.wait() 是线程协作的基础原语之一。其语义看似简单——使当前线程进入等待状态并释放对象监视器(monitor)——但背后涉及 JVM 层面复杂的同步调度逻辑。值得注意的是,wait() 方法本身是 Java 实现,而其核心阻塞逻辑委托给了一个私有、final 且 native 的方法:wait0()。

该方法声明如下(位于 java.lang.Object 类中):

private final native void wait0(long timeoutMillis) throws InterruptedException;

由于是 native 方法,其实现不在 Java 字节码中,而是由 JVM 以平台相关 C/C++ 代码提供。在 OpenJDK(特别是 HotSpot VM)中,这一调用并非直连单一函数,而是一条严谨分层的调用链:

? 调用链路全景图

  1. Java 层:Object.wait(long) → 调用 wait0(long)
  2. JNI 绑定层:wait0 对应 JNI 函数 Java_java_lang_Object_wait0,定义于 src/java.base/share/native/libjava/Object.c,但该文件仅作声明转发,实际跳转至 JVM 接口。
  3. JVM 接口层:通过 JVM_MonitorWait(声明于 jvm.h,实现在 jvm.cpp)统一处理 monitor 级等待。
  4. 同步器抽象层:JVM_MonitorWait 调用 ObjectSynchronizer::wait()(声明于 synchronizer.hpp,实现于 synchronizer.cpp),负责安全校验、线程状态切换及 monitor 获取。
  5. 核心实现层:最终落点为 ObjectMonitor::wait(),位于 objectMonitor.cpp —— 这里才是 wait0() 语义的终极实现:执行超时计算、将线程加入 _WaitSet 队列、触发 safepoint 协作、挂起线程,并在被 notify/notifyAll 唤醒或超时后完成重入竞争。

✅ 关键提示:ObjectMonitor 是 HotSpot 中对 Java 对象内置锁(intrinsic lock)的 C++ 封装,其 wait() 方法不仅管理线程阻塞/唤醒,还协同 GC、偏向锁撤销、自旋优化等底层机制,是 JVM 同步基础设施的核心组件。

javascript-typescript-typescript-scaffold
javascript-typescript-typescript-scaffold

你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型

下载

? 如何高效定位此类 native 实现?

  • 推荐方式:本地 IDE + 全项目索引
    克隆 openjdk/jdk 仓库,使用 IntelliJ IDEA 或 VS Code(配合 C/C++ 插件)导入项目。启用符号跳转(Go to Declaration / Find Usages),可一键穿透 wait0 → JVM_MonitorWait → ObjectSynchronizer::wait → ObjectMonitor::wait。

  • 浏览器快速导航技巧

    • 利用 GitHub 的 Go to File(t 键)搜索 Object.c、jvm.cpp、synchronizer.cpp;
    • 对模糊调用(如 ObjectSynchronizer::wait),使用 GitHub Code Search:输入 repo:openjdk/jdk "ObjectSynchronizer::wait",精准定位定义与调用点;
    • 注意分支一致性:主线开发通常在 master 或最新 LTS 分支(如 jdk21),避免在过时分支中查找。

⚠️ 注意事项与延伸思考

  • wait0() 不可被子类覆盖(private final),确保语义一致性;
  • 所有 wait 相关 native 方法(包括 notify0、notifyAll0)均遵循同一调用范式,共享 ObjectMonitor 状态机;
  • 在虚拟线程(Project Loom)场景下,wait0() 行为已被重构以支持 carrier thread 卸载,相关逻辑见 Continuation 与 VirtualThread 协同模块;
  • 生产环境调试时,不建议直接修改 objectMonitor.cpp,因其影响全局同步语义;如需定制行为,应优先通过 JMM 规范、java.util.concurrent 工具类或 JVMTI 代理实现。

理解 wait0() 的落地路径,不仅是阅读源码的实践范例,更是深入 JVM 内存模型、线程调度与锁实现的关键入口。掌握这条链路,你便真正触达了 Java 并发基石的物理层面。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java object

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

12437

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

9522

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

8112

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1304

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

1048

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1556

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

3269

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20491

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1415

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习