死锁问题的描述和代码体现
同步弊端:效率低;如果出现了同步嵌套,就容易产生死锁问题。
死锁问题:是指两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待现象。
同步代码块的嵌套案例代码如下:
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/chenmingjunCopyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】