JUC死锁的实现及其定位分析

Posted xdcat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JUC死锁的实现及其定位分析相关的知识,希望对你有一定的参考价值。

死锁的概念

两个或两个以上的进程在执行过程中,因抢夺资源而造成的一种互相等待的现象,若无外力干涉,它们都无法继续推进,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。

技术图片

 

 

 实现死锁

 1 class HoldLockThread implements Runnable{
 2 
 3     private String lockA;
 4     private String lockB;
 5 
 6     public HoldLockThread(String lockA, String lockB) {
 7         this.lockA = lockA;
 8         this.lockB = lockB;
 9     }
10 
11     @Override
12     public void run() {
13         synchronized (lockA){
14             System.out.println(Thread.currentThread().getName()+"持有"+lockA+",尝试获得"+lockB);
15             try {
16                 TimeUnit.SECONDS.sleep(2);
17             } catch (InterruptedException e) {
18                 e.printStackTrace();
19             }
20             synchronized (lockB){
21                 System.out.println(Thread.currentThread().getName()+"持有"+lockB+",尝试获得"+lockA);
22             }
23         }
24 
25     }
26 }
27 public class DeadLockDemo {
28     public static void main(String[] args) {
29         String lockA = "lockA";
30         String lockB = "lockB";
31         new Thread(
32             new HoldLockThread(lockA,lockB),"张三"
33         ).start();
34         new Thread(
35             new HoldLockThread(lockB,lockA),"李四"
36         ).start();
37     }
38 }

如何排查死锁?

linux: ps -ef|grep xxx

windows:类似ps的查看进程的命令

jps可以用来排查java程序的进程,定位到进程号

技术图片

jstack + 进程号 查看栈信息

 

 

 技术图片

 

栈信息的总结:两个线程导致的死锁

 技术图片

 

以上是关于JUC死锁的实现及其定位分析的主要内容,如果未能解决你的问题,请参考以下文章

JUC并发编程 活跃性 -- 死锁 & 定位死锁 & 哲学家就餐问题

死锁编码及定位分析

多线程之死锁定位及故障分析,尽可能避免线上事故(十三)

Day287.其他活性故障活锁&饥饿死锁常见面试题 -Juc

面对锁等待难题,数仓如何实现问题的秒级定位和分析

JUC-线程创建的四种方式+原理分析