Java面试——死锁编码及定位分析
程序员文章站
2022-05-22 11:20:45
...
一、概述
死锁是指两个或两个以上的进程在执行过程中,因争抢资源而造成的一种互相等待的现象,若无外力干涉它们将无法推进,如果系统资源充足,进程的资源请求能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。
死锁产生的原因:【1】系统资源不足;【2】资源分配不当;【3】进程运行推进的顺序不合适;
二、代码演示
public class TestMian {
//A、B 表示两把锁
String A = "A";
String B = "B";
public static void main(String[] args) {
TestMian testMian = new TestMian();
new Thread(()->{
try {
testMian.a();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
new Thread(()->{
try {
testMian.b();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
public void a() throws InterruptedException {
//持有锁A后,尝试持有锁B ***********重点**************
synchronized (A){
System.out.println("A");
TimeUnit.SECONDS.sleep(1);
synchronized (B){
System.out.println("B");
}
}
}
public void b() throws InterruptedException {
//持有锁B后,尝试持有锁A ***********重点**************
synchronized (B){
System.out.println("B");
TimeUnit.SECONDS.sleep(1);
synchronized (A){
System.out.println("A");
}
}
}
}
三、排查死锁
【1】jps 命令定位进程号:window 下 java 运行程序,也有类似与 Linux 操作系统的 ps -ef|grep xxx 的查看进程的命令,我们这里只查看 java 的进程,即使用 jps 命令
【2】jstack 能够找到死锁信息:
----如果喜欢,点个 红心♡ 支持以下,谢谢----
上一篇: Java 多线程编程4---同步与死锁
下一篇: 多线程 之 线程同步与死锁