讲师中心 微信公众号
AI工具推荐 视频效率加速

在Java中并发编程如何调试和排错_Java并发调试技巧解析

落伟同学_4881

落伟同学_4881

发布时间:2026-02-14 03:55:09

|

396人浏览过

|

来源于php中文网

原创

jstack -l 可一眼定位Java线程死锁,关键看“Found 1 deadlock.”或多个BLOCKED线程等待同一锁地址。

在java中并发编程如何调试和排错_java并发调试技巧解析

Java线程死锁怎么一眼定位?

用 jstack 是最直接的办法。当程序卡住、响应变慢,先别急着翻代码,立刻执行:jstack -l <pid></pid>。注意加 -l 参数——它能显示显式锁(ReentrantLock)的持有和等待关系,而默认输出只展示 synchronized 块。

关键看输出里有没有 “Found 1 deadlock.” 段落;如果没有,就扫一遍所有线程状态,重点找多个线程都处于 BLOCKED 状态,且都在等同一个 java.lang.Thread.State: BLOCKED (on object monitor) 地址的情况。

  • 常见陷阱:JVM 进程可能被误杀或重启,jstack 必须在问题复现时立刻抓取,延迟几秒就可能错过现场
  • 如果应用跑在容器里,得进容器执行,或者用 docker exec -it <container> jstack -l 1</container>(假设 Java 进程 PID 是 1)
  • jstack 输出中锁对象地址如 0x0000000712345678,要和线程堆栈里的 waiting to lock 对应上才构成证据链

为什么 ConcurrentHashMap 还会出并发 bug?

很多人以为用了 ConcurrentHashMap 就万事大吉,结果发现 get 到 null、计数不准、甚至 NullPointerException。根本原因在于:它只保证单个操作(put、get、remove)线程安全,不保证复合操作原子性。

比如 if (!map.containsKey(key)) map.put(key, value); 这种“检查-执行”逻辑,中间完全可能被其他线程插入,导致重复写入或覆盖。

立即学习“Java免费学习笔记(深入)”;

JavaStoryDevelop
JavaStoryDevelop

你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在

下载
  • 正确做法是用 map.putIfAbsent(key, value) 替代 if-put 模式
  • 需要条件更新时,优先考虑 computeIfAbsent 或 merge,它们内部已做 CAS 或锁分段保障
  • 如果必须手动同步,别锁 map 实例本身(易引发死锁),改用私有锁对象或 synchronized(map.getClass())(仅限极简单场景)

ThreadLocal 内存泄漏的真实诱因是什么?

不是因为没调 remove() 就一定会泄漏,而是当 ThreadLocal 变量被设为 null 后,其对应的 Entry 在线程的 ThreadLocalMap 中仍存在,且 key 是弱引用、value 是强引用——只要线程长期存活(比如线程池里的线程),value 就一直被 hold 住,无法 GC。

典型场景:Web 应用中,在 Filter 或 Interceptor 里 set 了一个大对象到 ThreadLocal,但忘记 remove,请求结束后该线程归还线程池,下一次复用时旧 value 仍在。

  • 必须在 finally 块里调 threadLocal.remove(),不能只靠 try-with-resources(ThreadLocal 不实现 AutoCloseable)
  • Tomcat 等容器会在请求结束时自动清理部分 ThreadLocal,但只针对它自己注册的,你自定义的仍需手动管理
  • 排查时可 dump heap 后用 MAT 搜索 java.lang.ThreadLocal$ThreadLocalMap$Entry,看 value 是否持有不该存在的大对象

用 CompletableFuture 时异步链突然中断却不报错?

这是最隐蔽的排错点:supplyAsync 或 thenApply 抛异常后,若没显式处理,异常会被吞掉,后续 thenAccept 不执行,也没有日志,整个链静默失败。

根本原因是 CompletableFuture 的异常默认只保存在内部 state 中,不会自动传播或打印;只有调用 join()、get() 或注册 exceptionally/handle 才会暴露。

  • 所有异步链末端务必加 whenComplete((r, e) -> { if (e != null) log.error("async failed", e); })
  • 避免在 thenRun 或 thenAccept 里写可能抛异常的逻辑,真要写,包一层 try-catch 并记录
  • 测试时别只看最终结果是否正确,要用 CountDownLatch 等方式强制等待 completion,再断言异常是否被正确捕获

并发问题往往不在代码写错,而在对工具类行为边界的误解。比如以为 CopyOnWriteArrayList 适合高频写,其实它每次写都复制数组,写多读少反而拖垮性能;又比如在 synchronized 方法里调远程服务,把锁范围无意扩大成服务响应时间。这些细节不通过真实压测和线程 dump 很难发现。

相关文章

编程速学教程(入门课程)
编程速学教程(入门课程)

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

下载

相关标签:

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

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
如何配置Tomcat环境变量
如何配置Tomcat环境变量

配置Tomcat环境变量需要在系统中添加CATALINA_HOME变量,并将Tomcat的安装路径添加到PATH变量中。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

845

2023.10.26

idea如何集成Tomcat
idea如何集成Tomcat

idea集成Tomcat的步骤:1、添加Tomcat服务器配置;2、配置项目部署;3、运行Tomcat服务器;4、访问项目;5、注意事项;6、关闭Tomcat服务器。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

304

2024.02.23

怎么查看Tomcat源代码
怎么查看Tomcat源代码

查看Tomcat源代码的步骤:1、下载Tomcat源代码;2、在IDEA中导入Tomcat源代码;3、查看源代码;4、理解Tomcat的工作原理;5、参与社区和贡献;6、注意事项;7、持续学习和更新;8、使用工具和插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

489

2024.02.23

常见的tomcat漏洞有哪些
常见的tomcat漏洞有哪些

常见的tomcat漏洞有:1、跨站脚本攻击;2、跨站请求伪造;3、目录遍历漏洞;4、缓冲区溢出漏洞;5、配置漏洞;6、第三方组件漏洞。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

305

2024.02.23

tomcat日志乱码怎么解决
tomcat日志乱码怎么解决

tomcat日志乱码的解决办法:1、修改tomcat的日志编码设置;2、检查ide的编码设置;3、检查操作系统的编码设置;4、使用过滤器处理日志;5、检查外部系统的编码设置;6、检查文件编码方式等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

348

2024.02.23

weblogic和tomcat有哪些区别
weblogic和tomcat有哪些区别

weblogic和tomcat的区别:1、功能;2、性能;3、规模;4、价格;5、安全性;6、配置和管理;7、社区支持;8、集成能力;9、升级和更新;10、可靠性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

349

2024.02.23

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

601

2024.02.23

tomcat启动闪退怎么解决
tomcat启动闪退怎么解决

tomcat启动闪退的解决办法:1、检查java环境;2、检查环境变量配置;3、检查端口被占用;4、检查配置文件编码;5、检查启动时需要的配置文件;6、检查相关文件是否丢失;7、检查防火墙和杀毒软件设置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

322

2024.02.23

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

0

2026.10.28

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn