多线程死锁例子

来源:互联网 发布:sql2000备份数据库 编辑:程序博客网 时间:2024/04/28 10:30

一.例子

 两个资源对象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();@Overridepublic void run() {// TODO Auto-generated method stubif (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

0 0
原创粉丝点击