進程A中包含資源A,進程B中包含資源B,A的下一步需要資源B,B的下一步需要資源A,所以它們就互相等待對方佔有的資源釋放,所以也就產生了一個循環等待死鎖。
代碼如下:
1 public class DeadLock {
2
3 public static void main(String[] args) {
4 Thread t1 = new Thread(new DeadLockTest(true));
5 Thread t2 = new Thread(new DeadLockTest(false));
6 t1.start();
7 t2.start();
8 }
9 }
10
11 class DeadLockTest implements Runnable{
12
13 private boolean flag;
14 static Object obj1 = new Object();
15 static Object obj2 = new Object();
16 public DeadLockTest(boolean flag) {
17 this.flag = flag;
18 }
19 public void run(){
20 if(flag){
21 synchronized(obj1){
22 System.out.println("if lock1");
23 synchronized (obj2) {
24 System.out.println("if lock2");
25 }
26 }
27 }else{
28 synchronized (obj2) {
29 System.out.println("else lock2");
30 synchronized (obj1) {
31 System.out.println("else lock1");
32 }
33 }
34 }
35 }
36 }
死鎖形成的必要條件總結(都滿足之後就會產生):
①、互斥條件:資源不能被共享,只能被同一個進程使用;
②、請求與保持條件:已經得到資源的進程可以申請新的資源;
③、非剝奪條件:已經分配的資源不能從相應的進程中強制剝奪;
④、循環等待條件:系統中若干進程形成環路,該環路中每個進程都在等待相鄰進程佔用的資源。