死锁问题

当线程中锁中套锁,两个线程在运行时都需要对方所占用的锁而不释放自己的锁,这样就造成了线程的停滞。下面通过一个例子来演示死锁的形成和避免办法。

 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 //避免办法:避免锁中上锁

 

posted @ 2019-07-27 17:57  codeFlyer  阅读(177)  评论(0)    收藏  举报