线程死锁问题

 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 }

我们以后在线上的话,怎么去查找线程死锁的问题呢?

1:jps命令。线程号,类名

2:jstack  打印进程栈的信息

原文地址:https://www.cnblogs.com/bulrush/p/10766929.html