题目
面试官:给你15分钟,设计一个死锁,应该问题不大吧
我:。。。。
代码
public class Test implements Runnable{
private static Object obj1 = new Object();
private static Object obj2 = new Object();
private int flag;
public Test(int flag) {
this.flag = flag;
}
@Override
public void run() {
if(flag == 0) {
synchronized (obj1) {
System.out.println(Thread.currentThread().getName() + "得到了obj1的锁");
try {
//确保另一个线程能够获得obj2的锁
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj2) {
System.out.println(Thread.currentThread().getName() + "得到了obj2的锁");
}
}
}else {
synchronized (obj2) {
System.out.println(Thread.currentThread().getName() + "得到了obj2的锁");
try {
//确保另一个线程能够获得obj1的锁
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj1) {
System.out.println(Thread.currentThread().getName() + "得到了obj1的锁");
}
}
}
System.out.println(Thread.currentThread().getName() + "运行结束");
}
public static void main(String[] args){
new Thread(new Test(0), "线程一").start();
new Thread(new Test(1), "线程二").start();
}
}
案例分析
线程1获得了 obj1 的锁,却在等待 obj2 的锁;线程2获得了 obj2 的锁,却在等待 obj1 的锁,两个线程只有先获取对方的锁才能够释放对方所需要的锁,进入了无限等待的情况,产生了死锁。