多线程死锁例子
2016-07-28 23:51
239 查看
一.例子
两个资源对象o1,o2,两个线程t1,t2。设置t1的初始条件为真,线程启动后。t1获取o1锁,然后等待o2。然后获取o2锁,然后释放o2锁。接着释放o1锁。程序结束
设置t2的初始条件为真,线程启动后。t2获取o2锁,然后等待o1。然后获取o1锁,然后释放o1锁。接着释放o2锁。程序结束
public class DeadLocker {
public static void main(String[] args) {
DeadLock t1 = new DeadLock();
t1.setName("线程1");
DeadLock t2 = new DeadLock();
t2.setName("线程2");
t1.flag = true;
t2.flag = false;
t1.start();
t2.start();
}
}
class DeadLock extends Thread {
public boolean flag = true;
static Object o1 = new Object();// 定义两个公共资源
static Object o2 = new Object();
@Override
public void run() {
// TODO Auto-generated method stub
if (flag) {
System.out.println(Thread.currentThread().getName() + "等待o1");
synchronized (o1) {
System.out.println(Thread.currentThread().getName() + "占用o1,等待o2");
synchronized (o2) {
System.out.println(Thread.currentThread().getName() + "占用o2");
}
System.out.println(Thread.currentThread().getName() + "释放o2");
}
System.out.println(Thread.currentThread().getName() + "释放o1");
} else {
System.out.println(Thread.currentThread().getName() + "等待o2");
synchronized (o2) {
System.out.println(Thread.currentThread().getName() + "占用o2,等待o1");
synchronized (o1) {
System.out.println(Thread.currentThread().getName() + "占用o1");
}
System.out.println(Thread.currentThread().getName() + "释放o1");
}
System.out.println(Thread.currentThread().getName() + "释放o2");
}
}
}
二.结果
不出现死锁的一种情况出现死锁的情况
参考http://blog.csdn.net/rebelqsp/article/details/23550019
相关文章推荐
- 提高工作效率的三个方法
- NYoj-58最少步数
- OkHttp源码解析(四)——失败重连
- hhvm-centos6
- eventbus指定接收者
- linux文件管理 cp mv mkdir rm rmdir
- IDF/Web/不难不易的js加密
- 《前端开发修炼之道》
- JSONP
- java位运算实现加减取模
- Fork/Join的一些好的文章
- 从0开始学习 GitHub 系列之「08.如何发现优秀的开源项目」
- Hbase原理详解
- 背景色及色彩搭配方案推荐
- 组合模式(composite)
- JavaScript实用技巧
- linux文件管理 练习
- MongoDB常用操作命令大全
- Leetcode 216. Combination Sum III (Medium) (cpp)
- tp基础补充