死锁问题及其解决

使用锁的话,有时候我们会遇到死锁问题,来看代码:

 1 package com.hw.third0225;
 2 
 3 public class DeadLock {
 4     public static Object lock1 = new Object();
 5     public static Object lock2 = new Object();
 6     
 7     public static void main(String[] args) {
 8         new Thread(new Thread1()).start();
 9         new Thread(new Thread2()).start();
10     }
11 }
12 
13 class Thread1 implements Runnable{
14     @Override
15     public void run() {
16         synchronized (DeadLock.lock1) {
17             System.out.println("获得lock1并完成甲事");
18             try {
19                 Thread.sleep(100);
20             } catch (InterruptedException e) {
21                 // TODO Auto-generated catch block
22                 e.printStackTrace();
23             }
24             synchronized (DeadLock.lock2) {
25                 System.out.println("同时获得lock1,lock2并完成丙事");
26             }
27         }
28     }
29 }
30 
31 class Thread2 implements Runnable{
32     @Override
33     public void run() {
34         synchronized (DeadLock.lock2) {
35             System.out.println("获得lock2并完成乙事");
36             try {
37                 Thread.sleep(100);
38             } catch (InterruptedException e) {
39                 // TODO Auto-generated catch block
40                 e.printStackTrace();
41             }
42             synchronized (DeadLock.lock1) {
43                 System.out.println("同时获得lock1,lock2并完成丙事");
44             }
45         }
46     }
47 }

那么在这份代码里面呢,public class里面创建了两个锁,并且设置为静态的,这样一来可以直接使用类名调用。然后在两个类里面,1号类是需要取得lock1再取得lock2,2号类相反,那么死锁问题是什么呢?来看运行结果:

 可以看到,两个线程都只执行了第一步输出,就没有然后了,然而程序一直在运行。这是因为,t1拿到了lock1,执行第一步,然后t2拿到lock2,执行它的第一步,但是要接着执行的时候,t1需要lock2,t2需要lock1,俩人互不相让,都在等着对方把钥匙交出来。这样肯定没完没了啊!这就是死锁问题。

解决方法:

要解决啊还是很简单的,我让t2第一次也拿lcok1就好了:

 1 package com.hw.third0225;
 2 
 3 public class DeadLock {
 4     public static Object lock1 = new Object();
 5     public static Object lock2 = new Object();
 6     
 7     public static void main(String[] args) {
 8         new Thread(new Thread1()).start();
 9         new Thread(new Thread2()).start();
10     }
11 }
12 
13 class Thread1 implements Runnable{
14     @Override
15     public void run() {
16         synchronized (DeadLock.lock1) {
17             System.out.println(Thread.currentThread().getName()+"获得lock1并完成甲事");
18             try {
19                 Thread.sleep(100);
20             } catch (InterruptedException e) {
21                 // TODO Auto-generated catch block
22                 e.printStackTrace();
23             }
24             synchronized (DeadLock.lock2) {
25                 System.out.println(Thread.currentThread().getName()+"获得lock1,lock2并完成丙事");
26             }
27         }
28     }
29 }
30 
31 class Thread2 implements Runnable{
32     @Override
33     public void run() {
34         synchronized (DeadLock.lock1) {
35             System.out.println(Thread.currentThread().getName()+"获得lock1并完成甲事");
36             try {
37                 Thread.sleep(100);
38             } catch (InterruptedException e) {
39                 // TODO Auto-generated catch block
40                 e.printStackTrace();
41             }
42             synchronized (DeadLock.lock2) {
43                 System.out.println(Thread.currentThread().getName()+"获得lock1,lock2并完成丙事");
44             }
45         }
46     }
47 }

 

 

 因为我两个线程第一步都需要lock1,那么t1先抢到了,t2就只能等着呗。然后问题就解决了。

posted @ 2021-02-25 14:57  EvanTheBoy  阅读(140)  评论(0)    收藏  举报