思路:定义2个锁、2个方法,2个方法获取锁的顺序相反,且中间有休眠时间。
这样启动2个线程分别运行这2个方法,2个线程会一直处于等锁状态。
public class NormalDeadLock {
private static Object valueFirst = new Object();//第一个锁
private static Object valueSecond = new Object();//第二个锁
//先拿第一个锁,再拿第二个锁
private static void fisrtToSecond() throws InterruptedException {
String threadName = Thread.currentThread().getName();
synchronized (valueFirst){
System.out.println(threadName+" get 1st");
Thread.sleep(100);
synchronized (valueSecond){
System.out.println(threadName+" get 2nd");
}
}
}
//先拿第二个锁,再拿第一个锁
private static void SecondToFisrt() throws InterruptedException {
String threadName = Thread.currentThread().getName();
synchronized (valueSecond){
System.out.println(threadName+" get 2nd");
Thread.sleep(100);
synchronized (valueFirst){
System.out.println(threadName+" get 1st");
}
}
}
private static class TestThread extends Thread{
private String name;
public TestThread(String name) {
this.name = name;
}
public void run(){
Thread.currentThread().setName(name);
try {
SecondToFisrt();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Thread.currentThread().setName("TestDeadLock");
//新建一个线程,先拿第2个锁,再拿第1个锁。
TestThread testThread = new TestThread("SubTestThread");
testThread.start();
try {
//主线程,先拿第1个锁,再拿第2个锁。
fisrtToSecond();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
结果:
如何定位死锁:
方法一:
- 找到jdk下bin的位置cmd,执行命令
jps -v
- 定位死锁:
jstack 16260
方法二:
点击这个,能出现和方法一一样的内容。
这样的死锁叫简单顺序死锁,其实我们可以眼看出来哪里有问题。
解决方案:
将2个方法获取锁的顺序修改成一样就可以了。