只需要模拟持有并请求,即线程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获取线程栈
可以看到这样的信息,即定位了死锁问题: