当线程中锁中套锁,两个线程在运行时都需要对方所占用的锁而不释放自己的锁,这样就造成了线程的停滞。下面通过一个例子来演示死锁的形成和避免办法。
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 //避免办法:避免锁中上锁
转载于:https://www.cnblogs.com/fangtingfei/p/11256097.html
相关资源:数据库死锁-解决死锁问题的三种办法