先上一个死锁的demo
class HoldLockThread implements Runnable {
private String lockA;
private String lockB;
public HoldLockThread(String lockA, String lockB) {
this.lockA = lockA;
this.lockB = lockB;
}
@Override
public void run() {
synchronized (lockA) {
System.out.println(Thread.currentThread().getName() + "\t自己持有" + lockA + ",尝试获取" + lockB);
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB) {
System.out.println(Thread.currentThread().getName() + "\t自己持有" + lockB + ",尝试获取" + lockA);
}
}
}
}
public class DeadLockDemo {
public static void main(String[] args) {
String lockA = "lockA";
String lockB = "lockB";
new Thread(new HoldLockThread(lockA, lockB), "AAA").start();
//注意这里是AB的位置,是把B赋值给A
//因此BBB线程是先拿到B锁
new Thread(new HoldLockThread(lockB, lockA), "BBB").start();
}
}
windows环境中,
jps -l 输出进程列表:
D:\Projects\IdeaProjects\demo>jps -l
5536 sun.tools.jps.Jps
11988 com.example.demo.thread.DeadLockDemo
14516 org.jetbrains.jps.cmdline.Launcher
14600
发现我们的java进程号 11988,然后使用命令
jstack 11988
可发现死锁信息: