死锁:两个 或两个以上的线程执行过程中因抢夺资源而互相等待的过程
package com.example.starter;
import java.util.concurrent.TimeUnit;
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()+" 自己只有" +
lockA+"尝试获得"+lockB);
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB){
System.out.println(Thread.currentThread().getName()+" 自己持有"
+lockB+"尝试获取"+lockA);
}
}
}
}
/**
* 两个 或两个以上的线程执行过程中
* 因抢夺资源而互相等待的过程
*/
public class DeadLockDemo {
public static void main(String[] args) {
String lockA = "lockA";
String lockB = "lockB";
new Thread(new HoldLockThread(lockA,lockB),"ThreadAAA").start();
new Thread(new HoldLockThread(lockB,lockA),"ThreadBBB").start();
}
}
如何定位是死锁:使用jps命令 和 jstack命令
Jps:window下的java运行程序 也有类似linux 下的ps查看进程的命令 jps == java ps
如何使用:
如下图所示 在代码右键 点击show in Explorer
2.到了代码指定目录 在cmd 回车
3.再回到idea 的terminal
使用jps命令
4.使用Jstack
根据线程id 使用jstack查看详细信息
5.jstack 查看后打印 定位出是死锁