死锁问题及其解决
使用锁的话,有时候我们会遇到死锁问题,来看代码:
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就只能等着呗。然后问题就解决了。

浙公网安备 33010602011771号