进程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 }
死锁形成的必要条件总结(都满足之后就会产生):
①、互斥条件:资源不能被共享,只能被同一个进程使用;
②、请求与保持条件:已经得到资源的进程可以申请新的资源;
③、非剥夺条件:已经分配的资源不能从相应的进程中强制剥夺;
④、循环等待条件:系统中若干进程形成环路,该环路中每个进程都在等待相邻进程占用的资源。