2019年互联网(1.10)
一.JUC多线程及并发包
1.10.死锁编码及定位分析
是什么
产生死锁的主要原因
-
系统资源不足
-
进程运行推进的顺序不合适
-
资源分配不当
代码解释:
package com.ybzn._01.juc;
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+"\t尝试获取:"+lockB);
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB){
System.out.println(Thread.currentThread().getName()+" 自己持有:"+lockB+"\t尝试获取:"+lockA);
}
}
}
}
/**
* @author Hugo
* @time 2021/2/22 2316
*/
public class DeadLockDemo_1_10 {
public static void main (String[] args) {
String lockA="lockA";
String lockB="lockB";
new Thread(new HoldLockThread(lockA, lockB), "Thread AA").start();
new Thread(new HoldLockThread(lockB, lockA), "Thread BB").start();
}
}
结果分析: 程序无法推进下去,左边红色框框出现了
解决
jps命令定位进程编号,获取死锁进行编号, 如图,12152
jstack找到死锁查看
jstack 12152