如何排查死锁
死锁:死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象!
上个代码演示死锁:
public class DeadLock001 {
public static void main(String[] args) {
String lockA="lockA";
String lockB="lockB";
new Thread(new DeadLock(lockA,lockB),"T1").start();
new Thread(new DeadLock(lockB,lockA),"T2").start();
}
}
class DeadLock implements Runnable{
private String lockA;
private String lockB;
public DeadLock(String lockA, String lockB) {
this.lockA = lockA;
this.lockB = lockB;
}
@Override
public void run() {
synchronized (lockA){
System.out.println(Thread.currentThread().getName()+"lock:"+lockA+"=>get"+lockB);
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB){
System.out.println(Thread.currentThread().getName()+"lock:"+lockB+"=>get"+lockA);
}
}
}
}
输出结果:
T2lock:lockB=>getlockA
T1lock:lockA=>getlockB
代码可直接用:1.这里开启了2个线程T1、T2。
A想去获取B的锁,B想去获取A的锁,互不相让。程序就卡主了!
排查办法:
命令:
jps -l
列出所有正在运行的java进程,其中jps命令也是一个java程序,前面的数字就是对应的进程id。
jstack pid
jstack是java虚拟机自带的一种堆栈跟踪工具。
解决:
1.输入jps -l 查看存活的线程id:
2.输入 jstack +id 查看堆栈情况:
3.打开svn查看提交记录,找到提交代码的人,然后抓着你的同事问,怎么写出这种屎山?!
收工~