多线程-死锁问题

死锁问题 什么是死锁?

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。

比如现在A有倚天剑,B有屠龙刀,A想要B的屠龙刀,B想要A的倚天剑,但是A不想把倚天剑给B,B同样也不想把屠龙刀给A。
两个人都等着对方把武器交出来...于是就形成了死锁。

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 + "获得倚天剑"); } } } } }

运行结果:

多线程-死锁问题

现在两个人都等着对方把武器交出来。 程序就一直卡住了。

产生死锁的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 + "获得倚天剑"); } } } }

运行结果:

多线程-死锁问题

现在两个人都获得了自己想要的武器了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwdsws.html