死锁问题 什么是死锁?
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
比如现在A有倚天剑,B有屠龙刀,A想要B的屠龙刀,B想要A的倚天剑,但是A不想把倚天剑给B,B同样也不想把屠龙刀给A。
两个人都等着对方把武器交出来...于是就形成了死锁。
运行结果:
现在两个人都等着对方把武器交出来。 程序就一直卡住了。
产生死锁的4个必要条件
互斥条件:一个资源每次只能被一个进程使用。
请求与保持条件:一个进程因请求资源而阻塞时,对以获得的资源保持不放。
不剥夺条件:进程以获得的资源,在未使用完之前,不能强行剥夺。
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
如何避免死锁只要进程不满足以上四个条件的一个或多个就可以避免死锁。
public class DeadLock { public static void main(String[] args) { new Thread(new T("灭绝师太",1)).start(); new Thread(new T("金毛狮王",0)).start(); } } class Yitianjian{ } class Tulongdao{ } class T implements Runnable{ static Yitianjian yitianjian = new Yitianjian(); static Tulongdao tulongdao = new Tulongdao(); private String name; private int flog; T(String name, int flog){ this.flog = flog; this.name = name; } @Override public void run() { if(flog == 1){ synchronized (yitianjian){ System.out.println(this.name + "获得倚天剑"); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } synchronized (tulongdao){ System.out.println(this.name + "获得屠龙刀"); } }else{ synchronized (tulongdao){ System.out.println(this.name + "获得屠龙刀"); } synchronized (yitianjian){ System.out.println(this.name + "获得倚天剑"); } } } }运行结果:
现在两个人都获得了自己想要的武器了。