黑马程序员-死锁
2015-07-23 14:05
387 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
在实际编程中,要尽量避免出现死锁的情况,但是故意写一个死锁的程序时似乎也不太简单,以下是一个简单的死锁例子,程序说明都写着类的注释里了,有点罗嗦,但是应该也还是表述清楚了的。
/**
* 一个简单的死锁类
* @author iStar
* 当类的对象flag=1时(T1),先锁定O1,睡眠500毫秒,然后锁定O2;
* 而T1在睡眠的时候另一个flag=0的对象(T2)线程启动,先锁定O2,睡眠500毫秒,等待T1释放O1;
* T1睡眠结束后需要锁定O2才能继续执行,而此时O2已被T2锁定;
* T2睡眠结束后需要锁定O1才能继续执行,而此时O1已被T1锁定;
* T1、T2相互等待,都需要对方锁定的资源才能继续执行,从而死锁。
*/
class DeadLock implements Runnable {
public int flag = 1;
static Object o1 = new Object(), o2 = new Object();
@Override
public void run() {
System.out.println("flag=" + flag);
if(flag == 1) {
synchronized(o1) {
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
synchronized(o2) {
System.out.println("1");
}
}
}
if(flag == 0) {
synchronized(o2) {
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
synchronized(o1) {
System.out.println("0");
}
}
}
}
public static void main(String[] args) {
DeadLock td1 = new DeadLock();
DeadLock td2 = new DeadLock();
td1.flag = 1;
td2.flag = 0;
new Thread(td1).start();
new Thread(td2).start();
}
}
在实际编程中,要尽量避免出现死锁的情况,但是故意写一个死锁的程序时似乎也不太简单,以下是一个简单的死锁例子,程序说明都写着类的注释里了,有点罗嗦,但是应该也还是表述清楚了的。
/**
* 一个简单的死锁类
* @author iStar
* 当类的对象flag=1时(T1),先锁定O1,睡眠500毫秒,然后锁定O2;
* 而T1在睡眠的时候另一个flag=0的对象(T2)线程启动,先锁定O2,睡眠500毫秒,等待T1释放O1;
* T1睡眠结束后需要锁定O2才能继续执行,而此时O2已被T2锁定;
* T2睡眠结束后需要锁定O1才能继续执行,而此时O1已被T1锁定;
* T1、T2相互等待,都需要对方锁定的资源才能继续执行,从而死锁。
*/
class DeadLock implements Runnable {
public int flag = 1;
static Object o1 = new Object(), o2 = new Object();
@Override
public void run() {
System.out.println("flag=" + flag);
if(flag == 1) {
synchronized(o1) {
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
synchronized(o2) {
System.out.println("1");
}
}
}
if(flag == 0) {
synchronized(o2) {
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
synchronized(o1) {
System.out.println("0");
}
}
}
}
public static void main(String[] args) {
DeadLock td1 = new DeadLock();
DeadLock td2 = new DeadLock();
td1.flag = 1;
td2.flag = 0;
new Thread(td1).start();
new Thread(td2).start();
}
}
相关文章推荐
- 黑马程序员-1.hashmap和hashtable的区别
- 黑马程序员——java基础——练习题:键盘输入两个正整数求两个数的最大公约数和最小公倍数
- 前端开发面试题
- 黑马程序员--面向对象
- 剑指offer_面试题3_二维数组中的查找(简单问题亦不能忽视)
- 面试要这样“厚脸皮”才能成功!
- (原创)超好用!程序员必备在线画图工具!-----ProcessOn
- 三. 黑马程序员—-java基础—-IO流
- Android小记:Android程序员不可错过的十款实用工具
- 跨行清算系统的实现过程
- 二. 黑马程序员—-java基础—-几个系统类
- 阿里电话面试总结(PHP研发工程师)2015-7-22
- 阿里内推面试经验总结
- 黑马程序员训练营-------反射原理
- 黑马程序员训练营-----java设计模式
- 黑马程序员训练营---------TreeSet集合中对象进行排序的两种方式
- 最全面的前端面试问题及答案总结
- 面试准备
- 一. 黑马程序员—-java基础—-正则表达式
- 程序员应该被时常提醒的几点