死锁问题

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

 

以上是关于死锁问题的主要内容,如果未能解决你的问题,请参考以下文章

java多线程死锁及死锁问题排查

死锁相关问题

如何处理SQL Server死锁问题

如何处理SQL Server死锁问题

如何处理SQL Server死锁问题

500分悬赏oracle死锁问题解决,决不食言