教你如何快速排查死锁,如何避免死锁!

死锁的处理策略——避免死锁 什么是安全序列 所谓安全序列,就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。当然,安全序列可能有多个。 如果分配了资源之后,系统中找不出任何一个安全序列,系统就进入了不安全状态。这就意味着之后可能所有进程都无法顺利的执行下去。当然,如果有进程提前归还了一些资源,那系统也就有可能重新回到安全状态,不过我们在分配资源之前总是要考虑到最坏的情况。 如果系统处于安全状态,就一定不会发生死锁。如果系统进入了不安全状态,就可能发生死锁(处于不安全状态未必.. 阅读详情

前言

相信程序员都会碰上这样的问题,Java死锁如何排查?又如何解决呢?那么,何为死锁呢?死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。今天老顾一次性来帮助大家解决Java死锁的有关问题。

实例

死锁的本质,举个例子如果此时有一个线程 A ,按照先获持有锁 a 再获取锁 b的顺序获得锁,同时另外一个线程 B,按照先获取锁 b 再获取锁 a 的顺序获取锁。如下图所示:
在这里插入图片描述
接着我们用代码模拟上线的执行过程
在这里插入图片描述
直接运行,发现主线程一直处于执行中,一直无法结束
在这里插入图片描述

通过jdk工具jps、jstack排查死锁问题

步骤一:使用jsp查找程序进行

jps:jdk提供的一个工具,可以查看到正在运行的java进程
在这里插入图片描述
步骤二:使用jstack查看线程堆栈信息

jstack:jdk提供的一个工具,可以查看java进程中线程堆栈信息。更详细的用法见文档最后。

$ jstack 96521

在这里插入图片描述
从上面的堆栈信息中我们可以发现这个内容:“Found one Java-level deadlock”,表示程序中发现了一个死锁,后面包含更多详细的信息,重点下面:
在这里插入图片描述
死锁的代码是在DeadLock.java的32行和18行,此时我们就可以去优化代码,解决死锁问题。

通过jdk提供的工具jconsole排查死锁问题

jconsole:jdk提供的一个可视化的工具,方便排查程序的一些问题,如:程序内存溢出、死锁问题等等。更详细的用法见文档最后。jconsole位于jdk的bin目录中

$ jconsole

在这里插入图片描述
可以看到我们的程序,点击连接。
在这里插入图片描述
点击“检测死锁”,可以看到程序死锁信息
在这里插入图片描述
上图中可以看到详细的死锁信息,和jstack中信息类似。

通过jdk提供的工具VisualVM排查死锁问题

VisualVM:jdk提供的一个非常强大的排查java程序问题的一个工具,可以监控程序的性能、查看jvm配置信息、堆快照、线程堆栈信息。算是程序优化的必备工具。工具位于jdk的bin目录中。

$ jvisualvm

在这里插入图片描述
切换到“线程”窗口
在这里插入图片描述
执行提示有死锁情况。在线程窗口中点击“线程Dump”按钮。
查看堆栈信息
在这里插入图片描述
线程堆栈快照的信息和jstack查看到的信息一样,即可发现死锁代码。

如何避免死锁?

我们知道了死锁如何产生的,那么就知道该如何去预防。如果一个线程每次只能获取一个锁,那么就不会出现由于嵌套持有锁顺序导致的死锁。

1. 正确的顺序获得锁

如果必须获取多个锁,我们就要考虑不同线程获取锁的顺序。

上面的例子出现死锁的根本原因就是获取所的顺序是乱序的,超乎我们控制的。上面例子最理想的情况就是把业务逻辑抽离出来,把获取锁的代码放在一个公共的方法里面,让这两个线程获取锁都是从我的公共的方法里面获取。

当Thread1线程进入公共方法时,获取了A锁,另外Thread2又进来了,但是A锁已经被Thread1线程获取了,所以只能阻塞等待。Thread1接着又获取锁B,Thread2线程就不能再获取不到了锁A,更别说再去获取锁B了,这样就有一定的顺序了。只有当线程1释放了所有锁,线程B才能获取。

比如前面的例子我们改成
在这里插入图片描述
查看打印结果,我们发现 线程0 获取成功然后线程1才能继续获取
在这里插入图片描述

2. 超时放弃

当线程获取锁超时了则放弃,这样就避免了出现死锁获取的情况。当使用synchronized关键词提供的内置锁时,只要线程没有获得锁,那么就会永远等待下去,然而Lock接口提供了boolean tryLock(long time, TimeUnit unit) throws InterruptedException方法,该方法可以按照固定时长等待锁,因此线程可以在获取锁超时以后,主动释放之前已经获得的所有的锁。通过这种方式,也可以很有效地避免死锁。

总结

死锁就是“两个任务以不合理的顺序互相争夺资源”造成,因此为了规避死锁,应用程序需要妥善处理资源获取的顺序。另外有些时候,死锁并不会马上在应用程序中体现出来,在通常情况下,都是应用在生产环境运行了一段时间后,才开始慢慢显现出来,在实际测试过程中,由于死锁的隐蔽性,很难在测试过程中及时发现死锁的存在,而且在生产环境中,应用出现了死锁,往往都是在应用状况最糟糕的时候——在高负载情况下。因此,开发者在开发过程中要谨慎分析每个系统资源的使用情况,合理规避死锁。

10 操作系统第二章 进程管理 死锁、死锁的处理策略 银行家算法 文章目录1 死锁1.1 死锁定义1.2 死锁、饥饿、死循环的区别1.3 死锁产生的必要条件1.4 什么时候会发生死锁1.5 死锁的处理策略1.6 死锁的概念小结2 死锁预防2.1 破坏互斥条件2.2 破坏不剥夺条件2.3 破坏请求和保持条件2.4 破坏循环等待条件2.5 预防死锁小结3 死锁避免3.1 安全序列3.2 银行家算法3.2.1 手动实现银行家算法3.2.2 代码实现银行家算法4 死锁的检测和解除4.1 死锁的检测 1 死锁 1.1 死锁定义 产生条件:每个人都占有一个资源,同时又在等待另 阅读详情

相关推荐

MySQL死锁如何排查并解决,以及后期如何监控和预防。

应用层面优化,比如重试机制,避免在事务中执行不必要的操作,减少锁的持有时间。此外,可以使用SHOW ENGINE INNODB STATUS命令来获取最近的死锁信息,里面包含了事务的详细信息、持有的锁、等待的锁等。分析死锁日志是关键,要找到涉及的事务和SQL语句,以及它们访问的数据和索引。整个思考过程需要覆盖死锁的产生原因、如何通过日志分析具体问题,然后给出具体的解决步骤,最后在监控和预防上给出可行的建议。预防措施中,可能需要提到应用程序的设计模式,比如使用乐观锁或悲观锁,根据场景选择合适的并发控制策略。

qq_39126115的博客 1669

怎么防止死锁?

2. 使用tryLock()方法:可以使用ReentrantLock类的tryLock()方法,在获取锁时设置超时时间,避免一直等待而产生死锁。总之,在编写多线程应用程序时,要时刻关注并发安全问题,特别是死锁问题,尽量避免造成资源竞争和持有锁时间过长等问题,保证程序的高性能和稳定性。5. 尽量减少锁的持有时间:如果持有锁的时间过长,那么就会增加死锁的可能性,因此需要尽量减少锁的持有时间。4. 使用不同的锁:如果可以使用不同的锁来代替原有的锁,那么可以尝试使用不同的锁来避免死锁。

m0_68464502的博客 3735

Java死锁如何避免?

这是造成死锁必须要达到的4个条件,如果要避免死锁,只需要不满⾜其中某⼀个条件即可。⽽其中前3 个条件是作为锁要符合的条件,所以要避免死锁就需要打破第4个条件,不出现循环等待锁的关系。死锁(Deadlock)是指多个线程互相持有对方需要的资源,导致所有线程都无法继续执行的情况。:多个线程形成环形等待链(A 等 B,B 等 C,C 等 A)。⼀个线程已经获得的资源,在未使⽤完之前,不能被强⾏剥夺。:如果拿不到锁,就释放已持有的锁,避免无限等待。:线程持有资源的同时,等待其他资源。:资源一次只能被一个线程占用。

完全体 1347

死锁的概念及如何避免死锁

一、资源问题 在系统中有许多不同类型的资源,其中可以引起死锁的主要是,需要采用互斥访问方法的、不可被抢占的资源,即临界资源。系统中这类资源有很多,如打印机、数据文件、队列、信号量等。 1.1 可重用性资源和消耗性资源 1.1.1 可重用性资源 可重用性资源是一种可供用户重复使用多次的资源 待补充115 1.2 可抢占性资源和不可抢占性资源 1.2.1 可抢占性资源 可把系统中的资源分成两类,一类是可抢占性资源,是指某进程在获得这类资源后,该资源可以再被其他进程或系统抢占。例如优先级高的进程可以抢占优先级低的

kking_edc的博客 5473

3步破解 java 死锁?手把手教你从0到1排查死锁!

本文通过生动的比喻和详细的代码示例,深入浅出地讲解了死锁问题的原理、排查方法和解决方案。首先,文章将死锁比作“独木桥上的僵局”,并介绍了死锁的四个必要条件。接着,通过Java和数据库的实例,展示了如何使用工具(如jstack、JMC、MySQL日志)快速定位死锁。最后,文章提供了代码优化和工具配置的实用建议,如统一锁顺序、引入超时机制等,帮助开发者有效避免和解决死锁问题。文章还通过电商秒杀系统的实战案例,展示了如何在实际项目中应用这些技巧,显著提升系统性能。

java专栏 1056

3步破解死锁?手把手教你从0到1排查死锁!

摘要: 本文系统性地解析了死锁的成因、排查与解决方案。通过类比“独木桥僵局”形象说明死锁四大条件(互斥、持有等待、不可抢占、循环等待),并给出典型Java代码示例。针对排查环节,详细演示了jstack、jconsole工具链和MySQL/SQL Server死锁日志分析方法。解决方案提出锁顺序统一、tryLock超时机制、数据库事务优化等实战技巧,结合电商秒杀案例展示优化效果。最后对比传统方法与工具化方案的效率差异,提供开发建议和自动修复“彩蛋”。全文以代码注释+流程图贯穿,兼顾技术深度与新手友好性。(14

java专栏 1037

什么是死锁?怎么排查死锁?怎么避免死锁?

突然发现我的图解系统缺了「死锁」的内容,这就来补下。 在面试过程中,死锁也是高频的考点,因为如果线上环境真多发生了死锁,那真的出大事了。 这次,我们就来系统地聊聊死锁的问题。 死锁的概念; 模拟死锁问题的产生; 利用工具排查死锁问题; 避免死锁问题的发生; 死锁的概念 在多线程编程中,我们为了防止多线程竞争共享资源而导致数据错乱,都会在操作共享资源之前加上互斥锁,只有成功获得到锁的线程,才能操作共享资源,获取不到锁的线程就只能等待,直到锁被释放。 那么,当两个线程为了保护两个不同的共享资源而使用了两个

小林coding 6169

死锁排查:3种方法、5个陷阱,90%的程序员都栽过跟头!

死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。简单来说,就是A线程在等待B线程释放资源,而B线程又在等待A线程释放资源,导致双方都"卡住"了。在系统中实现死锁检测机制,当检测到死锁时,自动恢复。定期检查线程状态使用图论算法检测环路选择代价最小的线程终止// 死锁检测算法(简化版)// 实现图论算法检测环路// ...// 选择代价最小的线程终止// ...为什么这方法好?

java专栏 895

如何快速排查死锁?如何避免死锁?(值得收藏)

前言 相信程序员都会碰上这样的问题,Java死锁如何排查?又如何解决呢?那么,何为死锁呢?死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。今天老顾一次性来帮助大家解决Java死锁的有关问题。 实例 死锁的本质,举个例子如果此时有一个线程 A ,按照先获持有锁 a 再获取锁 b的顺序获得锁,同时另外一个线程 B,按照先获取锁 b 再获取锁 a 的顺序获取锁。如下图所示: 接着我们用代码模拟上线的执行过程 直接运行,发现主线程一直处于执..

yuandengta的博客 1225

HC-05蓝牙模块AT指令配置避坑全记录:从配对失败到稳定主从通信

本文详细记录了HC-05蓝牙模块AT指令配置的全过程,从基础认知到主从通信的稳定实现。涵盖了进入AT模式的方法、关键AT指令详解、主从配对流程及常见故障排除,帮助开发者快速掌握蓝牙串口模块的配置技巧,避免常见配对失败问题。

weixin_42632434的博客 415

Vue3项目实战:用vue-print-nb搞定多页表格打印(附样式不丢失解决方案)

本文详细介绍了在Vue3项目中,如何利用vue-print-nb插件解决Element Plus多页表格打印的样式丢失与分页错乱等核心难题。通过分离打印视图、编写专用CSS控制分页行为、以及深入理解浏览器打印原理,提供了一套从基础配置到高级技巧的完整企业级打印解决方案,确保打印输出专业可靠。

linux的博客 1233

数据库死锁问题的排查与解决

数据库死锁是一种特殊的并发问题,指两个或多个事务在并发操作时,因相互等待对方释放资源(如锁)而无法继续进行,导致这组事务永远处于等待状态。死锁可能会导致数据库中的事务超时,无法完成。

lssffy的博客 7928

(SEED-Lab)Buffer Overflow Vulnerability Lab缓冲区溢出实验

(SEED-Lab)Buffer Overflow Vulnerability Lab 欢迎大家访问我的GitHub博客 https://lunan0320.cn 文章目录一、实验目的二、实验步骤与结果2.1 环境初始化2.2 Task1 运行shellcode2.3漏洞程序2.4 Task 22.5 Task 3: ASLR2.6 Task 4: Stack Guard2.7 Task 5:不可执行栈三、参考文献 一、实验目的 理解缓冲区溢出攻击的原理以及如何实施攻击 理解针对缓冲区溢出的防御措施

lunan的博客 8981

「操作系统」深入理解死锁(什么是死锁?死锁形成条件?如何避免死锁?如何排查死锁?)

死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程)。多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方的资源,所以这两个线程就会互相等待而进入死锁状态。

frozenpenguin的博客 3044

英伟达 Jetson AGX Thor 官方入门教程(一)系统U盘安装

NVIDIA Jetson AGX Thor开发套件快速安装指南 本指南详细介绍了NVIDIA Jetson AGX Thor开发套件的安装流程。该套件搭载T5000 SoM,为物理AI和机器人应用提供强大支持。安装过程采用全新的JetPack 7.0方案,通过USB闪存盘即可完成BSP(Jetson Linux)安装,无需依赖Ubuntu主机。指南包含硬件开箱说明、两种配置模式(带显示器/无显示器)、详细的ISO镜像下载和USB制作步骤(推荐使用Balena Etcher工具),以及首次启动后的初始设置流

机器人控制与仿真应用 2868

美的集团-数据挖掘工程师面试分享

美的集团-数据挖掘工程师面试分享

511

【Java核心-进阶】线程——排查死锁、避免死锁

1. 线程死锁的原因 死锁:两个或多个线程之间,由于互相持有对方需要的锁,而永久出于阻塞的状态。 会引起死锁的代码示例: Java代码 publicstaticvoidmain(String[]args)throwsInterruptedException{ StringlockA="lock-A"; Str...

一个被IT搞的 374

【nnUNetv2进阶】三、nnUNetv2 自定义网络-发paper必会

对于很多朋友来说,找到nnunet的网络结构位置的代码可能比较困难,因为nnunet的网络结构从else:代码中没有网络结构的类名,那么使用的网络是哪个呢?打开预处理后的数据集中的nnUNetPlans.json文件,如下图,configurations里面有2d、3d_fullres等,这些表示nnunet的模型,下面的network_class_name指的就是训练使用的模型结构,一般都是PlainConvUNet。

AI爱好者的博客,分享计算机领域相关知识 8757

系统死锁别慌!这5招教你快速破解(附实战案例)

举个生活例子:小明和小红各拿了一只筷子,都想夹盘子里的菜。但夹菜需要两只筷子,于是小明等着小红的筷子,小红等着小明的筷子,两人僵持不下,这就是“死锁”。在程序里,死锁发生在多个线程互相占用对方需要的资源,又都不肯释放的情况。线程A持有资源1,等待资源2线程B持有资源2,等待资源1双方永远等不到对方松手,程序就卡住了。场景推荐方案注意事项测试环境临时救急暴力终止(方案1)别用于生产!数据可能丢失生产环境快速恢复释放资源(方案2)需提前设计“可释放”的资源逻辑长期解决方案。

全栈开发工程师 1668

web渗透--9--识别web应用框架

1、概述 Web框架指纹识别是信息收集过程中的一个重要任务。获悉目标框架的类型必然为测试人员带来极大的优势,如果该框架在之前就被测试过。测试人员不仅可以获得未修补版本中存在的漏洞,还可以了解此框架中特有的错误配置以及已知的文件结构。从而使指纹识别过程显得格外重要。

武天旭的博客 5100

【YOLOv8/v9/v10 实战 01】YOLOv8/v9/v10全系列实战对决:性能矩阵、架构拆解与2026部署指南

2026年YOLO生态已进入“战国时代”,Ultralytics YOLOv8/11/26、阿里YOLO12、清华YOLOv10、微软YOLOv9四大路线并行发展。本文基于官方文档、学术论文及实测数据,系统剖析三大核心版本(YOLOv8/v9/v10)的架构演进逻辑,构建覆盖参数量、mAP、FPS、FLOPs的完整性能矩阵。通过8组工业场景实测、全流程代码实现(训练-导出-部署)、6类硬件适配方案,解决新手选型难、进阶者优化无门、工业开发者部署低效的痛点。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 534

一文学会Java死锁和CPU 100% 问题的排查技巧

做一个积极的人 编码、改bug、提升自己 我有一个乐园,面向编程,春暖花开 工欲善其事,必先利其器 之前整理过一篇文章,本篇是对那篇的优化:Java死锁排查和Java CPU 100% 排查的步骤整理和OOM FullGc案例 文章目录00 本文简介01 Java死锁排查和解决啥是死锁?为啥子会出现死锁?怎么排查代码中出现了死锁?【重点来了】1、使用 jps + jstack2、使用jcons...

阿飞云漫步 3911

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

什么是死锁?产生死锁的四个必要条件是什么?如何在代码中排查和避免死锁(请结合JDK工具和编码实践说明)?

死锁是指两个或多个线程相互持有对方所需的资源(如锁),且都不主动释放,导致所有线程永远处于阻塞状态,无法继续执行的现象。

weixin_43521001的博客 945

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

MySQL死锁问题排查

MySQL死锁问题排查

weixin_66400215的博客 1181

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

如何排查死锁问题

死锁是进程死锁的简称,是由Dijkstra于1965年研究银行家算法时首先提出来的。它是计算机系统乃至并发程序设计中最难处理的问题之一。我们平时比较会常遇到的应该就是数据库死锁了...

奇舞周刊 2607

真实系统死锁解决:死锁场景与排查方法

在高并发环境下,使用 Redis 分布式锁与数据库行锁的结合可以有效避免死锁并提升系统的性能和稳定性。Redis 分布式锁负责控制分布式系统中对共享资源的访问,而数据库行锁则用于保证在事务级别的并发控制。这种方式的核心思想是:利用 Redis 分布式锁在应用层确保全局资源的独占访问,再使用数据库行锁来确保数据库操作的原子性和一致性。在最初的设计中,系统未引入 Redis 分布式锁,仅依赖 Oracle 数据库的分布式锁(行级锁)来控制资源竞争。由于锁的获取顺序不一致,可能导致资源的循环等待,最终触发死锁。

流楚丶格念的博客 1457
上一篇: Java实现字符串倒序输出以及判断一个字符串中某个字符的出现次数
下一篇: Java调用WebService接口的四种方式
_Ricky_
博客等级 码龄10年 971粉丝 29原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值