-
什么是死锁?
死锁指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象
如:
线程A持有A锁试图获取B锁
线程B持有B锁试图获取A锁
-
编写一个简单的死锁程序
/**
* @author ck
* @create 2019-08-12 20:26
*/
public class Deadlock {
private String lockA;
private String lockB;
public Deadlock(String lockA, String lockB) {
this.lockA = lockA;
this.lockB = lockB;
}
public void get(){
synchronized (lockA){
System.out.println(Thread.currentThread().getName() + "获得"+lockA+",尝试获取" + lockB);
synchronized (lockB){
}
}
}
public static void main(String[] args) {
String lockA = "lockA";
String lockB = "lockB";
new Thread(() -> {
Deadlock deadlock = new Deadlock(lockA,lockB);
deadlock.get();
},"AA").start();
new Thread(() -> {
Deadlock deadlock = new Deadlock(lockB,lockA);
deadlock.get();
},"BB").start();
}
}
运行结果
-
死锁定位及分析
1.打开命令行终端,切换到程序目录,使用 jps 指令查看当前正在运行的java程序
2.我们对一些可疑的程序进行分析,使用 jstack 进程号 查看程序运行信息