【多线程】死锁是怎么产生的?
死锁:一个线程需要同时获取多把锁,这时就容易发生死锁
例如: 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
