【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 + 进程号 查看栈信息

 

 

 

 

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

 

 

posted @ 2020-05-28 18:50  xd会飞的猫  阅读(214)  评论(0编辑  收藏  举报