什么情況下會發生死鎖


死鎖發生的條件

  • 互斥條件:就是一個資源只能有一個進程占有,不可以被兩個或者多個進程占有
  • 不可搶占條件:進程已經獲得的資源在未使用完之前,不可以被搶占,只能在使用完之后自己釋放
  • 占有申請條件:進程自己已經至少保持一個資源,又請求其他資源,但是這個資源被其他進程占有,而且又不釋放自己已經占有的資源
  • 循環等待條件:發生死鎖時,必定會形成一個進程——資源的環路。進程集合{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 }  

最后兩個線程都等着對方的資源,都進入等待狀態,最后不會有線程執行,就進入了死鎖狀態


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM