class MyResource implements Runnable{
public String lockA;
public String lockB;
public MyResource(String lockA,String lockB){
this.lockA = lockA;
this.lockB =lockB;
}
@Override
public void run() {
synchronized (lockA){
System.out.println("目前持有"+lockA+"想要获取"+lockB);
synchronized (lockB){
}
}
}
}
public class DepthThread {
public static void main(String[] args) {
String lockA ="AAA";
String lockB ="BBB";
Thread t1 = new Thread(new MyResource(lockA, lockB));
Thread t2 = new Thread(new MyResource(lockB, lockA));
t1.start();
t2.start();
}
}
创建死锁
接下来 jps -l 查看进程
9264 sun.tools.jps.Jps
5724 org.jetbrains.jps.cmdline.Launcher
5980
6412 线程池.DepthThread
根据进程id6412 再查看具体的分析 jstack 6412
“Thread-1”:
waiting to lock monitor 0x00000000034f8538 (object 0x00000000eb707468, a java.lang.String),
which is held by “Thread-0”
“Thread-0”:
waiting to lock monitor 0x00000000034fafd8 (object 0x00000000eb707498, a java.lang.String),
which is held by “Thread-1”
Java stack information for the threads listed above:
“Thread-1”:
at 线程池.MyResource.run(DepthThread.java:21)
- waiting to lock <0x00000000eb707468> (a java.lang.String)
- locked <0x00000000eb707498> (a java.lang.String)
at java.lang.Thread.run(Thread.java:748)
“Thread-0”:
at 线程池.MyResource.run(DepthThread.java:21)
- waiting to lock <0x00000000eb707498> (a java.lang.String)
- locked <0x00000000eb707468> (a java.lang.String)
at java.lang.Thread.run(Thread.java:748)