大厂面试官让我设计一个死锁,我的方案是这样的

题目

面试官:给你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 的锁,两个线程只有先获取对方的锁才能够释放对方所需要的锁,进入了无限等待的情况,产生了死锁。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章