您的位置:首页 > 其它

多线程死锁例子

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: