死锁是指两个或两个以上的线程因为争夺资源而造成的一种互相等待的现象,若无外力干涉,他们都将无法进行下去。
直接上代码吧,我们写一个死锁的示例
class HoldLockThread implements Runnable {
String lockA;
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 {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB) {
System.out.println(Thread.currentThread().getName());
}
}
}
}
public class DeadLockDemo {
public static void main(String[] args) {
String lockA = "lockA";
String lockB = "lockB";
new Thread(new HoldLockThread(lockA,lockB),"AAA").start();
new Thread(new HoldLockThread(lockB,lockA),"BBB").start();
}
}
那万一发生了死锁我们怎么定位呢?
首先我们可以用jps定位进程号
jps定位进程号.png
再用jstack找到死锁查看(用于生成虚拟机当前时刻的线程快照)
jstack找到死锁查看.png
网友评论