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 打印进程栈的信息