思路:定义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个方法获取锁的顺序修改成一样就可以了。
本文通过一个具体的死锁案例,展示了两个线程因获取锁的顺序不同而导致的死锁现象。详细介绍了如何通过修改锁的获取顺序来解决死锁问题,并提供了定位死锁的方法。
702

被折叠的 条评论
为什么被折叠?



