并发编程中的死锁定位排查 秒速五厘米 2022-05-18 06:29 148阅读 0赞 **1、死锁定义:** 死锁是一种特定的程序状态,在实体之间,由于循环依赖导致彼此一直处于等待之中,没有任何个体可以继续前进。死锁不仅仅是在线程之间会发生,存在资源独占的进程之间同样也可能出现死锁。通常来说,我们大多是聚焦在多线程场景中的死锁,指两个或多个线程之间,由于互相持有对方需要的锁,而永久处于阻塞的状态。 示例图理解基本的死锁问题: ![这里写图片描述][70] -------------------- **2、死锁实例:** /** * 死锁测试 **/ public class DeadLockSample extends Thread { private String first; private String second; public DeadLockSample(String name, String first, String second) { super(name); this.first = first; this.second = second; } public void run() { synchronized (first) { try { System.out.println(this.getName() + " ...synchronized:===> 【first】" + first); Thread.sleep(1000L); synchronized (second) { System.out.println(this.getName() + " ...synchronized:===>【second】 " + second); } } catch (InterruptedException e) { } } } public static void main(String[] args) throws InterruptedException { String lockA = "lockA"; String lockB = "lockB"; DeadLockSample t1 = new DeadLockSample("t1", lockA, lockB); DeadLockSample t2 = new DeadLockSample("t2", lockB, lockA); t1.start(); t2.start(); t1.join(); t2.join(); } } 执行程序发现(程序无法继续运行,且没有停止): ![这里写图片描述][70 1] 此时就是线程出现死锁了。 -------------------- > 定位死锁最常见的方式就是利用 jstack 等工具获取线程栈,然后定位互相之间的依赖关系,进而找到死锁。如果是比较明显的死锁,往往 jstack 等就能直接定位,类似 JConsole 甚至可以在图形界面进行有限的死锁检测。 **3、利用`jstack`定位死锁:** (1)、 在cmd窗口,使用`jps`指令查询该类的端口号(pid) ![这里写图片描述][70 2] (2)、再使用 `jstack + pid`查看日志(`jstack 3408`): ![这里写图片描述][70 3] 发现出现死锁,并且该日志也定位了出现死锁的位置,接下来就是进行修复工作了! **TIP:在实际应用中,死锁情况未必有如此清晰的输出,但是总体上的分析步骤为:** 区分线程状态 -> 查看等待目标 -> 对比 Monitor 等持有状态 [70]: /images/20220518/324d4ea281404994aee50f9c43dc8564.png [70 1]: /images/20220518/0c525efff90c44eaa449ecbf8875b959.png [70 2]: /images/20220518/62a63fb2424b4e05895c3d4e3817f776.png [70 3]: /images/20220518/2f12b17121234158ad1b154935903d1b.png
相关 并发编程中的Java死锁问题 在Java并发编程中,死锁是一个常见的问题。死锁是指两个或更多的进程,在执行过程中因争夺资源而造成的一种僵局。 以下是产生Java死锁的常见条件: 1. 互斥资源:多个线程 雨点打透心脏的1/2处/ 2024年09月22日 01:42/ 0 赞/ 11 阅读
相关 Java并发编程中的死锁案例 在Java并发编程中,死锁是一个常见的问题。以下是一个简单的死锁案例: ```java // 创建两个互有依赖的线程 class ThreadA implements Run 傷城~/ 2024年09月19日 21:12/ 0 赞/ 12 阅读
相关 并发编程:Java中的死锁问题 在Java的多线程环境中,死锁是一种常见的并发问题。死锁发生时,系统无法进行正常的资源分配,因为每个线程都在等待其他线程释放资源。 以下是一个简单的Java代码示例,展示了如 太过爱你忘了你带给我的痛/ 2024年09月16日 04:57/ 0 赞/ 22 阅读
相关 并发编程:Java中的死锁示例 在Java编程中,死锁是一个常见的并发问题。当两个或更多的线程互相等待对方释放资源时,就会发生死锁。 以下是一个Java中创建死锁的简单示例: ```java import 左手的ㄟ右手/ 2024年09月10日 04:03/ 0 赞/ 30 阅读
相关 java死锁和死锁定位分析 1.死锁:死锁是指两个或者两个以上的进程在执行的过程中,因为争夺资源而造成的一种互相等待的现象,若无外力干涉,那他们将无法推进下去 ![watermark_type_ZmFu 超、凢脫俗/ 2023年05月22日 22:18/ 0 赞/ 26 阅读
相关 死锁定位与解决方案 1.源码如下 package cn.haochen.locak; / @author haochen desc:死锁模拟 深藏阁楼爱情的钟/ 2022年10月24日 01:35/ 0 赞/ 133 阅读
相关 并发编程-线程卡死问题排查与解决 目标 线程卡死问题排查 参考: Java并发编程(第十章,第四章) [Future.get卡死,线程池的一个坑点][Future 淩亂°似流年/ 2022年10月13日 12:36/ 0 赞/ 272 阅读
相关 并发编程中的死锁定位排查 1、死锁定义: 死锁是一种特定的程序状态,在实体之间,由于循环依赖导致彼此一直处于等待之中,没有任何个体可以继续前进。死锁不仅仅是在线程之间会发生,存在资源独占的进程之间同 秒速五厘米/ 2022年05月18日 06:29/ 0 赞/ 149 阅读
相关 死锁定位及分析 什么是死锁? > 死锁指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象 > > 如: > > 线程A持有A锁试图获取B锁 > 线程B 秒速五厘米/ 2021年10月18日 16:50/ 0 赞/ 258 阅读
还没有评论,来说两句吧...