線程死鎖問題

 1 package com.demo.bingfa;
 2 
 3 /**
 4  * java併發編程中,死鎖的概念
 5  *
 6  * 咱們啓用了兩個線程,分別搶佔2個資源,但這兩個資源又分別被不一樣的對象(字符串)鎖住了。
 7  * 當第一個線程調用 resource1 方法,進入同步塊,拿到鎖,並等待 1 秒鐘讓另外一個線程進入
 8  * resource2 同步塊,當第二個線程進入同步塊後,注意:此時, 拿着 resourec1 鎖的線程企
 9  * 圖拿到 resource2 的鎖,但這個時候,拿着 resource2 的線程也想去拿 resource1 的鎖。於
10  * 是就出現了互相僵持的狀況,誰也沒法拿到對方的鎖,整個系統就卡死了。
11  */
12 public class DeadLock {
13     public static void main(String[] args) {
14         //lambda表達式,
15         //啓動一個線程去獲取資源1。
16         Thread thread1 = new Thread(() -> {
17             try {
18                 new DeadLock().resource1();
19             } catch (InterruptedException e) {
20                 e.printStackTrace();
21             }
22         });
23         thread1.setName("線程1");
24         thread1.start();
25 
26         //啓動另外一個線程去獲取資源2.
27         Thread thread2 = new Thread(() -> {
28             try {
29                 new DeadLock().resource2();
30             } catch (InterruptedException e) {
31                 e.printStackTrace();
32             }
33         });
34         thread2.setName("線程2");
35         thread2.start();
36     }
37 
38     void resource1() throws InterruptedException{
39         synchronized ("resource1"){
40             System.out.println("獲取資源1");
41             //等待1秒,讓另一個線程獲取資源
42             Thread.sleep(1 * 1000);
43             resource2();
44         }
45     }
46 
47      void resource2() throws InterruptedException{
48          synchronized ("resource2"){
49              System.out.println("獲取資源2");
50              //等待1秒,讓另一個線程獲取資源
51              Thread.sleep(1 * 1000);
52              resource1();
53          }
54     }
55 }

咱們之後在線上的話,怎麼去查找線程死鎖的問題呢?java

1:jps命令。線程號,類名

 

2:jstack  打印進程棧的信息

相關文章
相關標籤/搜索