一、造成死锁的原因
二、自己写一个死锁
/*
* Copyright (C), 2013-2019, 天津大海云科技有限公司
*/
import java.util.concurrent.TimeUnit;
/**
* 死锁测试
*
* @author yangjikang
* @date 2019/6/19 15:26
* @modified By yangjikang
*/
class LockData implements Runnable{
private String param1;
private String param2;
public LockData(String param1, String param2) {
this.param1 = param1;
this.param2 = param2;
}
@Override
public void run() {
synchronized (param1){
System.out.println(Thread.currentThread().getName()+"已经锁住了"+param1+",还需要锁住"+param2);
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在尝试获取\t"+param2);
synchronized (param2){
System.out.println(Thread.currentThread().getName()+"已经锁住了"+param2+",还需要锁住"+param1);
}
System.out.println("两个参数都获取成功...");
}
}
}
public class TestHoldLock {
public static void main(String[] args) {
String string1 ="第一个参数";
String string2 ="第二个参数";
new Thread(new LockData(string1,string2),"AA").start();
new Thread(new LockData(string2,string1),"BB").start();
}
}
三、解决
怎么确定是死锁问题
3.1 jps命令定位进程号
3.2 jstack找到死锁查看