什么情况下会发生死锁

死锁发生的条件

  • 互斥条件:就是一个资源只能有一个进程占有,不可以被两个或者多个进程占有
  • 不可抢占条件:进程已经获得的资源在未使用完之前,不可以被抢占,只能在使用完之后自己释放
  • 占有申请条件:进程自己已经至少保持一个资源,又请求其他资源,但是这个资源被其他进程占有,而且又不释放自己已经占有的资源
  • 循环等待条件:发生死锁时,必定会形成一个进程——资源的环路。进程集合{p1,p2,p3}中,p1请求p2占有的资源,p2请求p3占有的资源,p3请求p1占有的资源

看到一个例子感觉很好:http://blog.csdn.net/qq_35064774/article/details/51793656

 1 package com.qf.test;
 2 public class TestThread {  
 3     public static void main(String[] args) {  
 4 // test dead lock  
 5         Thread t9 = new Thread(  
 6                 new DeadLock(true));  
 7         Thread t10 = new Thread(  
 8                 new DeadLock(false));  
 9         t9.start();  
10         t10.start();  
11     }  
12 }  
13   
14 class DeadLock implements Runnable{  
15   
16     boolean lockFormer;  
17     static Object o1 = new Object();  
18     static Object o2 = new Object();  
19     DeadLock(boolean lockFormer){  
20         this.lockFormer = lockFormer;  
21     }  
22       
23     @Override  
24     public void run() {  
25         if(this.lockFormer){  
26             synchronized (o1) {  
27                 try {  
28                     Thread.sleep(500);  
29                 } catch (InterruptedException e) {  
30                     e.printStackTrace();  
31                 }  
32                 synchronized (o2) {  
33                     System.out.println("1ok");  
34                 }  
35             }  
36         }else{  
37             synchronized (o2) {  
38                 try {  
39                     Thread.sleep(500);  
40                 } catch (InterruptedException e) {  
41                     e.printStackTrace();  
42                 }  
43                 synchronized (o1) {  
44                     System.out.println("1ok");  
45                 }  
46             }  
47         }  
48           
49     }  
50 }  

最后两个线程都等着对方的资源,都进入等待状态,最后不会有线程执行,就进入了死锁状态

转载于:https://www.cnblogs.com/qf123/p/8610899.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值