当前位置:网站首页>并发编程 — 死锁排查及处理
并发编程 — 死锁排查及处理
2022-07-05 06:40:00 【搬运Gong】
前言
相信不少程序员在工作中都遇到过死锁这种场景,比如数据库死锁、应用程序死锁。那么大家都是如何来处理这种情况的呢?本文将通过一个简单的案例来进行梳理相关思路及解决方案,希望可以帮到遇到类似情况的童鞋。
1. 什么是死锁?
死锁是指两个或者两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那它们都将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。

产生死锁的主要原因:
① 系统资源不足;
② 进程运行推荐的顺序不合时候;
③ 资源分配不当;
2. 手写一个死锁的 case案例
上面我们知道了什么是死锁以及死锁产生的条件,那么来通过手写一个案例来体验一下死锁:
public static void main(String[] args) {
final Object objectA = new Object();
final Object objectB = new Object();
new Thread(() -> {
synchronized (objectA) {
System.out.println("线程 " + Thread.currentThread().getName() + " 启动,持有 A锁...");
try {
TimeUnit.SECONDS.sleep(1L);
synchronized (objectB) {
System.out.println("线程 " + Thread.currentThread().getName() + " 尝试获取 B 锁,成功!!");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"A").start();
new Thread(() -> {
synchronized (objectB) {
System.out.println("线程 " + Thread.currentThread().getName() + " 启动,持有 B锁...");
try {
TimeUnit.SECONDS.sleep(1L);
synchronized (objectA) {
System.out.println("线程 " + Thread.currentThread().getName() + " 尝试获取 A 锁,成功!!");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"B").start();
}
可以看到,两个线程互相争抢资源,导致死锁产生,程序处于一直运行阶段,无法结束。
3. 死锁排查
通过手写的死锁 case,知道了存在死锁,那么真实的生产环境是无法定位到是不是真的出现了死锁情况的,比如写了一个 while(true) {} 无限循环一段代码块。
3.1 命令行排查
如何定位产生了死锁呢?很简单,使用JDK 自带的命令- jstack 来查看 JVM 的堆栈信息:
① jps -查看正在运行的 Java 进程;
② jstack 进程 ID;


通过输出的信息可以看到,检查到了死锁,并且指出了具体产生死锁的代码行数。
3.2 图形界面排查
还有另外一种方式来排查死锁,也是 JDK 提供的一个图形化的命令 jconsole,通过这个命令可以连接到具体的Java 进程,在图形化中进行查看。


两种方式,都可以定位到死锁出现的位置。定位到位置后,优化程序规避死锁即可(通过死锁产生的原因进行规避)。
以上,是两种最简单也最实用的排查死锁的方法,在真实的生产环境遇到程序卡顿、无响应的时候,可通过这种方式来排查是否是因为产生了死锁占用大量资源不释放导致的。
边栏推荐
- Sum of two numbers, the numbers in the array are converted to decimal, added, and output inversely
- 解读最早的草图-图像翻译工作SketchyGAN
- SolidWorks template and design library are convenient for designers to call
- GDB code debugging
- 在本地搭建一个微服务集群环境,学习自动化部署
- Technical conference arrangement
- Use the Paping tool to detect TCP port connectivity
- Preemption of CFS scheduling
- CGroup CPU group source code analysis
- How to correctly ask questions in CSDN Q & A
猜你喜欢
![[QT] QT multithreading development qthread](/img/7f/661cfb00317cd2c91fb9cc23c55a58.jpg)
[QT] QT multithreading development qthread

SOC_SD_CMD_FSM

Financial risk control practice -- feature derivation based on time series

Skywalking全部

Vant Weapp SwipeCell设置多个按钮

达梦数据库全部

你心目中的数据分析 Top 1 选 Pandas 还是选 SQL?

Qt项目中的日志库log4qt使用

Genesis builds a new generation of credit system

Design specification for mobile folding screen
随机推荐
ROS2——Service服务(九)
NVM Downloading npm version 6.7.0... Error
2022 winter vacation training game 5
三体目标管理笔记
LSA Type Explanation - detailed explanation of lsa-2 (type II LSA network LSA) and lsa-3 (type III LSA network Summary LSA)
[nvidia] CUDA_ VISIBLE_ DEVICES
Technical conference arrangement
【MySQL8.0不支持表名大写-对应方案】
Orin two brushing methods
TypeScript入门
Knapsack problem acwing 9 Group knapsack problem
6-2 sequence table operation set
Game theory acwing 892 Steps Nim game
Idea debug failed
SOC_SD_CMD_FSM
vim
Using handler in a new thread
Positive height system
confidential! Netease employee data analysis internal training course, white whoring! (attach a data package worth 399 yuan)
Some classic recursion problems