死锁

来源:互联网 发布:新媒体软件 编辑:程序博客网 时间:2024/06/10 04:23

死锁现象:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期的阻塞,因此程序不可能正常终止。

 

死锁产生的四个必要条件:

1.互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用。

2.不可抢占,资源请求者不能强制从资源占有者中夺取资源,资源只能由占有者主动释放。

3.请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。

4.循环等待,即存在一个等待队列:p1占有p2的资源,p2占有p3的资源,p3占有p1的资源这样就形成了一个等待环路。

 

当上述四个条件都成立的时候,便形成死锁。当然,死锁的情况下如果打破上述任何一个条件,便可让死锁消失。


一般什么时候出现死锁?

同步中嵌套同步。


class Test implements Runnable{private boolean flag;Test(boolean flag){this.flag = flag;}public void run(){if(flag){synchronized(MyLock.locka){System.out.println("if Locka");synchronized(MyLock.lockb)//持有a锁之后需要申请b锁{System.out.println("if lockb");}}}else{synchronized(MyLock.lockb){System.out.println("else lockb");synchronized(MyLock.locka)//持有b锁之后需要申请a锁{System.out.println("else locka");}}}}}class MyLock{static Object locka = new Object();static Object lockb = new Object();}class DeadLockTest{public static void main(String[] args){Thread t1 = new Thread(new Test(true));Thread t2 = new Thread(new Test(false));t1.start();t2.start();}}

0 0
原创粉丝点击