黑马程序员技术交流社区
标题:
【记录】代码练习-死锁
[打印本页]
作者:
Kevin.Kang
时间:
2015-8-5 13:19
标题:
【记录】代码练习-死锁
死锁:
两个或两个以上的线程在争夺资源的过程中,发生的一种相互等待的现象
例如:
中国人,外国人吃饭
正常:
中国人:筷子两支
外国人:刀和叉
死锁:
中国人:筷子一支,刀一把
外国人:筷子一支,叉一把
两个人出现死锁以后,都不能正常用餐,都等着对方
package com.kxg_12;
public class DieLock extends Thread {
// 创建两个锁对象
public static Object objA = new Object();
public static Object objB = new Object();
// 定义变量
private boolean flag;
// 定义构造方法
public DieLock(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
if (flag) {
// 线程A中嵌套线程B
synchronized (objA) {
System.out.println("if ObjA");
synchronized (objB) {
System.out.println("if objB");
}
}
} else {
// 线程B中嵌套线程A
synchronized (objB) {
System.out.println("else objB");
synchronized (objA) {
System.out.println("else objA");
}
}
}
}
}
复制代码
package com.kxg_12;
public class DieLockDemo {
public static void main(String[] args) {
// 创建两个线程
DieLock dl1 = new DieLock(true);
DieLock dl2 = new DieLock(false);
// 启动线程
dl1.start();
dl2.start();
}
}
复制代码
作者:
Kevin.Kang
时间:
2015-8-5 14:09
if中的语句抢到执行权,输入"if objA"。输出"if objB"之前被else中的语句抢到了执行权
else语句输出"else objB",当往下执行的时候需要获取objA锁,但是objA锁在if语句线程中没有释放。
只好等着if语句中释放。此时if语句抢到执行权,往下执行的时候发现需要objB锁,但objB锁在else语句线程中没有释放。
这样就形成了死锁。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2