【多线程】死锁是怎么产生的?
死锁
:一个线程需要同时获取多把锁,这时就容易发生死锁
例如: t1 线程获得A对象锁,接下来想获取B对象的锁 t2 线程获得B对象锁,接下来想获取A对象的锁
代码如下:
public class Deadlock { public static void main(String[] args) { Object A = new Object(); Object B = new Object(); Thread t1 = new Thread(() -> { synchronized (A) { System.out.println("lock A"); try { sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } synchronized (B) { System.out.println("lock B"); System.out.println("操作..."); } } }, "t1");
Thread t2 = new Thread(() -> { synchronized (B) { System.out.println("lock B"); try { sleep(500); } catch (InterruptedException e) { throw new RuntimeException(e); } synchronized (A) { System.out.println("lock A"); System.out.println("操作..."); } } }, "t2"); t1.start(); t2.start(); } }
控制台输出结果: 此时程序并没有结束,这种现象就是死锁现象...线程t1持有A的锁等待获取B锁, 线程t2持有B的锁等待获取A的锁。
如何进行死锁诊断?
当程序出现了死锁现象,我们可以使用jdk自带的工具:jps和 jstack
步骤如下: 第一:查看运行的线程
运行命令: jstack -l 46032