【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 + 進程號 查看棧信息

 

 

 

 

棧信息的總結:兩個線程導致的死鎖

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章