一、什么是死锁?
死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那它们都将无法推进下去,如果资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。
二、手写死锁案例
public class DeadLockDemo {
public static void main(String[] args) {
final Object objectA = new Object();
final Object objectB = new Object();
new Thread(() -> {
synchronized (objectA) {
System.out.println(Thread.currentThread().getName() + "\t 自己持有A锁,希望获取B锁");
try {
TimeUnit.MILLISECONDS.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
synchronized (objectB) {
System.out.println(Thread.currentThread().getName() + "\t 成功获取B锁");
}
}
}, "A").start();
new Thread(() -> {
synchronized (objectB) {
System.out.println(Thread.currentThread().getName() + "\t 自己持有B锁,希望获取A锁");
try {
TimeUnit.MILLISECONDS.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
synchronized (objectA) {
System.out.println(Thread.currentThread().getName() + "\t 成功获取A锁");
}
}
}, "B").start();
}
}
案例说明
代码中存在两个线程,其中线程A尝试获取B锁,而线程B尝试获取A锁。
运行结果
解析
线程A在获取B的锁时,A已被上锁,而在线程A睡眠的1s内,线程B也尝试获取A的锁,由图片我们可以知道程序并未停止,二者因争夺资源而造成的一种互相等待的死锁现象。
三、死锁排查
纯指令
在终端输入 jps -l
找到该类对应的进程号
再输入jstack 28773
查看对应堆信息
可以看到双方互相持有、相互等待,以致造成死锁。
图形化
在终端输入jconsole
选择对应进程
这里可以清楚看到死锁位置及信息。
以上是死锁相关知识,希望对大家有所帮助。