在面试中,许多面试官都会在多线程开发中深入去考察,然而死锁问题是大多数面试官喜欢问的一个问题,
下方为一个简单的死锁代码实现:(其实话题理解很简单,和贪吃蛇一样头咬着尾巴)
package com.thread.xzz;
/**
* 一个简单的死锁类
* main方法中启动两个线程,分别调用methodA和methodB方法
* methodA方法首先获取到a对象的锁,睡眠1秒钟
* 此时methodB方法执行获取到b对象的锁,睡眠1秒
* 此时methodA需要去获取b对象的锁才能继续执行,但是b锁没有被释放无法获取到
* 此时methodB需要去获取a对象的锁才能继续执行,但是a锁没有被释放无法获取到
* 从而两者相互等待,都需要得到对方锁定的资源才能继续执行,从而死锁。
*/
public class DeadLock {
private static String a = "1";
private static String b = "2";
public void methodA() {
synchronized (a) {
System.out.println("我是A方法中获得到了A锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (b) {
System.out.println("我是A方法中获取到b锁");
}
}
}
public void methodB() {
synchronized (b) {
System.out.println("我是B方法中获得到了b锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (a) {
System.out.println("我是B方法中获取到a锁");
}
}
}
public static void main(String[] args) {
new Thread(() -> {
d.methodA();
}).start();
new Thread(() -> {
d.methodB();
}).start();
}
}
上述代码就会产生死锁:
我是A方法中获得到了A锁
我是B方法中获得到了b锁
在面试中问到一定不要发蒙,要理解好死锁是如何产生的思路清晰 代码即可实现。