0

0

在Java中什么是死锁_Java死锁产生原因解析

P粉602998670

P粉602998670

发布时间:2026-02-07 13:40:51

|

237人浏览过

|

来源于php中文网

原创

死锁是多线程互相持有对方所需锁而全部阻塞的现象,需同时满足互斥、占有并等待、不可剥夺、循环等待四个条件;典型代码中两线程以不同顺序获取lockA和lockB导致闭环等待。

在java中什么是死锁_java死锁产生原因解析

死锁不是代码写错了,而是多个线程互相持有对方需要的锁,谁也不肯先放——结果全部卡住不动。

死锁发生的四个必要条件

Java 中的死锁必须同时满足以下四点,缺一不可:

  • 互斥:锁是独占的,synchronizedReentrantLock 都默认满足
  • 占有并等待:一个线程已持有一个锁,又去申请另一个锁(比如先 synchronized(A.class),再 synchronized(B.class)
  • 不可剥夺:Java 中锁不能被强制释放,持有者必须主动退出同步块或调用 unlock()
  • 循环等待:线程 T1 等 T2 的锁,T2 又等 T1 的锁,形成闭环

最典型的死锁代码长什么样

下面这段代码在多线程环境下极大概率触发死锁:

public class DeadlockExample {
    private static final Object lockA = new Object();
    private static final Object lockB = new Object();

    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            synchronized (lockA) {
                try { Thread.sleep(100); } catch (InterruptedException e) {}
                synchronized (lockB) {
                    System.out.println("t1 done");
                }
            }
        });

        Thread t2 = new Thread(() -> {
            synchronized (lockB) {
                try { Thread.sleep(100); } catch (InterruptedException e) {}
                synchronized (lockA) {
                    System.out.println("t2 done");
                }
            }
        });

        t1.start(); t2.start();
    }
}

关键问题在于:两个线程获取 lockAlockB 的顺序不一致。t1 先 A 后 B,t2 先 B 后 A —— 这就是循环等待的温床。

Face++旷视
Face++旷视

Face⁺⁺ AI开放平台

下载

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

如何检测和避免死锁

JDK 自带工具能帮你发现运行中的死锁:

  • jstack 查看线程,输出里如果出现 Found 1 deadlock. 就确认了
  • 在 JConsole 或 VisualVM 的「线程」页签中点「Detect Deadlock」按钮
  • 避免嵌套锁:尽量只在一个同步块内操作,不跨块持锁再申请
  • 一加锁顺序:所有线程按相同顺序获取锁(比如按对象哈希值排序:if (a.hashCode() )
  • 使用带超时的锁:lock.tryLock(1, TimeUnit.SECONDS) 失败就释放已有锁,重试或放弃

真正难处理的不是写出来就死锁的代码,而是那些在高并发、特定时序下才暴露的锁竞争路径——它们往往藏在日志里不报错,只让系统慢慢变慢、响应延迟飙升。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

797

2023.08.22

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

403

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

582

2023.08.10

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

534

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

17

2025.12.06

线程和进程的区别
线程和进程的区别

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

612

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

282

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

21

2026.01.21

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.02.06

热门下载

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

精品课程

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

共23课时 | 3.3万人学习

C# 教程
C# 教程

共94课时 | 8.8万人学习

Java 教程
Java 教程

共578课时 | 59.4万人学习

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

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