0

0

在Java里为什么会发生线程死锁_Java死锁原因解析

P粉602998670

P粉602998670

发布时间:2026-02-25 08:55:36

|

210人浏览过

|

来源于php中文网

原创

死锁发生的四个必要条件缺一不可:互斥、请求与保持、不可剥夺、循环等待;其中互斥不可破,后三者可通过固定锁顺序、避免嵌套错序加锁等方式打破。

在java里为什么会发生线程死锁_java死锁原因解析

死锁发生的四个必要条件缺一不可

Java里发生死锁,不是因为“锁用多了”,而是同时满足了四个经典条件:互斥、请求与保持、不可剥夺、循环等待。只要其中任意一个被打破,死锁就不会出现——但注意,互斥是锁机制的基础,不能也不该被破坏;真正可操作的是后三个。

  • 请求与保持:线程拿着锁1,又去申请锁2,而锁2正被别人拿着——这是最常写错的逻辑,比如转账方法里先锁账户A再锁账户B,但并发时另一线程反着来
  • 不可剥夺:Java中没有强制抢锁的机制(synchronizedReentrantLock都不支持),所以一旦持有就只能等它自己释放
  • 循环等待:本质是锁获取顺序不一致。两个线程对同一组对象加锁,但顺序相反,比如线程1:lockA → lockB,线程2:lockB → lockA,只要时间点卡得准,立刻卡死

最典型的代码死锁场景:嵌套 synchronized 错序

下面这段代码在 JDK 8+ 上跑几次大概率复现死锁,不是偶然,是设计缺陷:

private static final Object lock1 = new Object();
private static final Object lock2 = new Object();
<p>// 线程1
synchronized (lock1) {
System.out.println("T1: got lock1");
Thread.sleep(10);
synchronized (lock2) { /<em> 等 lock2 → 可能被T2占着 </em>/ }
}</p><p>// 线程2<br />
synchronized (lock2) {
System.out.println("T2: got lock2");
Thread.sleep(10);
synchronized (lock1) { /<em> 等 lock1 → 可能被T1占着 </em>/ }
}

关键点在于:Thread.sleep(10) 不是“为了演示”才加的,而是模拟真实业务中锁持有时间不可控——哪怕只差几毫秒,就足以让两个线程各自拿到一把锁、再一起卡住。

为什么 ReentrantLock.tryLock() 也救不了乱序加锁?

有人以为换成 ReentrantLock + tryLock(long, TimeUnit) 就安全了,其实不然。超时只是避免无限等待,但没解决根本问题:如果两个线程都成功拿到第一把锁,又几乎同时调用 tryLock() 争第二把,失败后若不做统一回退(比如释放已持锁并重试),反而可能引发活锁或资源浪费。

HIX.AI
HIX.AI

HIX.AI是一个多功能的一体化AI写作助手,集成了120多种AI写作工具,支持50多种语言,能够满足各种写作需求。

下载

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

  • 正确做法不是“加 tryLock”,而是“固定锁顺序”:比如按对象哈希值排序,始终先锁 Math.min(lockA.hashCode(), lockB.hashCode()) 对应的锁
  • tryLock() 的超时时间设太短(如 1ms)会导致频繁重试;设太长(如 5s)又失去响应性——它只是逃生通道,不是避坑指南
  • 注意:ReentrantLock 默认不支持公平模式,高并发下即使顺序一致,也可能因调度抖动导致实际加锁次序偏移

排查死锁比预防更难,但 jstack 是免费救命稻草

线上服务突然卡住?别急着重启,先用 jps 找到 Java 进程 ID,再执行 jstack <pid></pid>。如果真有死锁,输出末尾会明确标出:

Found one Java-level deadlock:
=============================
"Thread-1":
  waiting to lock monitor 0x00007f8b4c005a00 (object 0x000000071a201230, a java.lang.Object),
  which is held by "Thread-0"
"Thread-0":
  waiting to lock monitor 0x00007f8b4c005b00 (object 0x000000071a201240, a java.lang.Object),
  which is held by "Thread-1"

这个输出直接告诉你哪两个线程、哪两个对象在互相锁死——但注意,它只报告“已发生的死锁”,对“即将发生的”无能为力。所以核心还是编码阶段就约束锁顺序,而不是靠事后诊断。

最容易被忽略的一点:静态工具(如 SpotBugs)能检测部分锁顺序不一致模式,但对动态生成锁对象(比如基于账户ID新建的new Object())完全无效——这种死锁,只能靠设计契约和 Code Review 来守住底线。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

智谱清言 - 免费全能的AI助手
智谱清言 - 免费全能的AI助手

智谱清言 - 免费全能的AI助手

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

720

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

95

2025.12.01

Golang 面试题精选:高频问题与解答
Golang 面试题精选:高频问题与解答

Golang 面试题精选》系统整理企业常见 Go 技术面试问题,覆盖语言基础、并发模型、内存与调度机制、网络编程、工程实践与性能优化等核心知识点。每道题不仅给出答案,还拆解背后的设计原理与考察思路,帮助读者建立完整知识结构,在面试与实际开发中都能更从容应对复杂问题。

1

2026.02.24

Golang 运行与部署实战:从本地到云端
Golang 运行与部署实战:从本地到云端

《Golang 运行与部署实战》围绕 Go 应用从开发完成到稳定上线的完整流程展开,系统讲解编译构建、环境配置、日志与配置管理、容器化部署以及常见运维问题处理。结合真实项目场景,拆解自动化构建与持续部署思路,帮助开发者建立可靠的发布流程,提升服务稳定性与可维护性。

2

2026.02.24

Golang 疑难杂症解决指南:常见问题排查与优化
Golang 疑难杂症解决指南:常见问题排查与优化

《Golang 疑难杂症解决指南》聚焦开发过程中常见却棘手的问题,从并发模型、内存管理、性能瓶颈到工程化实践逐步拆解。通过真实案例与调试思路,帮助开发者定位问题根因,建立系统化排查方法。不只给出答案,更强调分析路径与工具使用,让你在复杂 Go 项目中具备持续解决问题的能力。

0

2026.02.24

Golang 入门学习路线:从零基础到上手开发
Golang 入门学习路线:从零基础到上手开发

Golang 入门路线涵盖从零到上手的核心路径:首先打牢基础语法与切片等底层机制;随后攻克 Go 的灵魂——接口设计与 Goroutine 并发模型;接着通过 Gin 框架与 GORM 深入 Web 开发实战;最后在微服务与云原生工具开发中进阶,旨在培养具备高性能并发处理能力的后端工程师。

0

2026.02.24

中国研究生招生信息网官方网站入口 研招网网页版在线入口
中国研究生招生信息网官方网站入口 研招网网页版在线入口

中国研究生招生信息网入口(https://yz.chsi.com.cn) 此网站是研究生报名入口的唯一官方网站

60

2026.02.24

苹果官网入口与在线访问指南_中国站点快速直达与iPhone查看方法
苹果官网入口与在线访问指南_中国站点快速直达与iPhone查看方法

本专题汇总苹果官网最新可用入口及中国站点访问方式,涵盖官网直达链接、iPhone官方页面查看方法与常见访问说明,帮助用户快速进入苹果官方网站,便捷了解产品信息与官方服务。

13

2026.02.24

Asianfanfics官网入口与访问指南_AFF官方平台最新登录地址
Asianfanfics官网入口与访问指南_AFF官方平台最新登录地址

本专题系统整理Asianfanfics(AFF)官方网站最新可用入口,涵盖官方平台最新直达地址、官网登录方式及中文访问指引,帮助用户快速、安全地进入AFF平台浏览与使用相关内容。

13

2026.02.24

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.9万人学习

C# 教程
C# 教程

共94课时 | 10.1万人学习

Java 教程
Java 教程

共578课时 | 71.5万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号