死锁问题的描述和代码体现
同步弊端:效率低;如果出现了同步嵌套,就容易产生死锁问题。
死锁问题:是指两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待现象。
同步代码块的嵌套案例代码如下:
1 package cn.itcast_02; 2 3 public class MyLock { 4 // 创建两把锁对象 5 public static final Object objA = new Object(); 6 public static final Object objB = new Object(); 7 }
1 package cn.itcast_02; 2 3 public class DieLock extends Thread { 4 5 private boolean flag; 6 7 public DieLock(boolean flag) { 8 this.flag = flag; 9 } 10 11 @Override 12 public void run() { 13 if (flag) { 14 synchronized (MyLock.objA) { 15 System.out.println("if objA"); 16 synchronized (MyLock.objB) { 17 System.out.println("if objB"); 18 } 19 } 20 } else { 21 synchronized (MyLock.objB) { 22 System.out.println("else objB"); 23 synchronized (MyLock.objA) { 24 System.out.println("else objA"); 25 } 26 } 27 } 28 } 29 30 }
1 package cn.itcast_02; 2 3 /* 4 * 同步的弊端: 5 * A:效率低 6 * B:如果出现了同步嵌套,就容易产生死锁问题 7 * 8 * 死锁: 9 * 是指两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待现象。 10 * 11 * 举例: 12 * 中国人和美国人一起吃饭案例。 13 * 正常情况: 14 * 中国人:筷子两支 15 * 美国人:刀和叉 16 * 现在: 17 * 中国人:筷子1支,刀一把 18 * 美国人:筷子1支,叉一把 19 */ 20 public class DieLockDemo { 21 public static void main(String[] args) { 22 DieLock dl1 = new DieLock(true); 23 DieLock dl2 = new DieLock(false); 24 25 dl1.start(); 26 dl2.start(); 27 } 28 }
理想情况下程序的运行结果为:
if objA if objB else objB else objA 或者 else objB else objA if objA if objB 死锁情况下程序的运行结果为:
if objA else objB 或者 else objB if objA 这四种程序运行结果都有可能发生!
我的GitHub地址: https://github.com/heizemingjun
我的博客园地址: http://www.cnblogs.com/chenmingjun
我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】