死锁问题
Posted fangtingfei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了死锁问题相关的知识,希望对你有一定的参考价值。
当线程中锁中套锁,两个线程在运行时都需要对方所占用的锁而不释放自己的锁,这样就造成了线程的停滞。下面通过一个例子来演示死锁的形成和避免办法。
1 package cn.ftf.threadsafe;
2 /**
3 * 过多的同步可能会造成互相不释放资源,从而相互等待,一般发生于同步中持有多个对象的锁,锁中套锁
4 *
5 * 避免:不要再在同一代码块中同时持有多个对象的锁,避免锁中上锁
6 * @author 房廷飞
7 *
8 */
9 public class DeadLockThread implements Runnable
10 static Object a=new Object(); //用Static关键字修饰,保证实例化多少个对象都是这同一个同一个对象
11 static Object b=new Object();
12 private boolean flag;
13 public DeadLockThread(boolean flag)
14 super();
15 this.flag = flag;
16
17 @Override
18 public void run()
19 if(flag)
20 synchronized (a)
21 System.out.println("给 a 对象上锁了。");
22 try
23 Thread.sleep(200);
24 catch (InterruptedException e)
25 e.printStackTrace();
26
27 synchronized (b)
28 System.out.println("给 b 对象上锁了。 a 锁中上锁");
29
30
31 else
32 synchronized (b)
33 System.out.println("给 b 对象上锁了。");
34 try
35 Thread.sleep(200);
36 catch (InterruptedException e)
37 e.printStackTrace();
38
39 synchronized (a)
40 System.out.println("给 a 对象上锁了。 b 锁中上锁");
41
42
43
44
45 public static void main(String[] args)
46 DeadLockThread dead1=new DeadLockThread(true);
47 DeadLockThread dead2=new DeadLockThread(false);
48
49 new Thread(dead1).start();
50 new Thread(dead2).start();
51
52
53
54 /*
55 运行结果:
56
57 给 b 对象上锁了。
58 给 a 对象上锁了。
59
60 */
61
62 //避免办法:避免锁中上锁
以上是关于死锁问题的主要内容,如果未能解决你的问题,请参考以下文章