只需要模拟持有并请求,即线程0获得A锁后又去请求B锁,线程1获得B锁后又去请求A锁,由于循环依赖导致彼此一直在等待。

DeadLock.java
public class DeadLock implements Runnable{
private String str1; //锁A
private String str2; //锁B
public DeadLock(String str1, String str2){
this.str1 = str1;
this.str2 = str2;
}
@Override
public void run(){
synchronized(str1){
System.out.println( Thread.currentThread().getName() + "\tLock: " + str1);
try{
Thread.currentThread().sleep(10);
synchronized(str2){
System.out.println(Thread.currentThread().getName() + "\tLock: " + str2);
}
}catch(Exception e){
e.printStackTrace();
}
}
}
}
Main.java
public class Main {
public static void main(String[] args) {
String str1 = "A";
String str2 = "B";
new Thread(new DeadLock(str1, str2), "Thread-A").start();
new Thread(new DeadLock(str2, str1), "Thread-B").start();
}
}
结果:

如何定位死锁问题?
先通过jps查询当前运行的java程序pid号
![]()
然后使用jstack获取线程栈
![]()
可以看到这样的信息,即定位了死锁问题:


本文通过一个简单的示例,展示了如何创建一个Java死锁程序,并解释了如何使用jps和jstack命令来定位和分析死锁问题。在示例中,两个线程互相持有并请求对方所持有的锁,形成循环等待,导致死锁状态。
825

被折叠的 条评论
为什么被折叠?



