java多线程死锁例子

首先看下面一个例子,


package aaa;

public class test {
	
public static void main(String[] args) {
		Object obj = new Object();
		Object obj1 = new Object();
		LockThread diedLock = new LockThread(obj, obj1);
		LockThread1 diedLock1 = new LockThread1(obj, obj1);
		diedLock.start();
		diedLock1.start();
	}

}

class LockThread extends Thread {
	private Object obj;
	private Object obj1;

	public LockThread(Object obj, Object obj1) {
		this.obj = obj;
		this.obj1 = obj1;
	}

	@Override
	public void run() {
		synchronized (obj) {
			try {
				Thread.sleep(500);
				synchronized (obj1) {
					System.out.println("执行不到这一步,因为LockThread1类中已经将obj1锁住,");
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

class LockThread1 extends Thread {
	private Object obj;
	private Object obj1;

	public LockThread1(Object obj, Object obj1) {
		this.obj = obj;
		this.obj1 = obj1;
	}

	@Override
	public void run() {
		synchronized (obj1) {
			try {
				Thread.sleep(500);
				synchronized (obj) {
					System.out.println("执行不到这一步,因为LockThread类中已经将obj锁住,他们都在等待对方释放资源");
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}


其中objobj1 是两个共享变量,调用LockThread   执行run方法的时 首先将obj 对象锁住(synchronized),然后sleep 0.5秒,此时程序将调用LockThread1 类的run方法,将obj1对象锁住(synchronized),然后sleep 0.5秒,此时LockThread的run方法睡醒了,要去锁obj1对象,但是此时obj1对象已经被LockThread1 类锁住,要等LockThread1 类释放了对obj1对象的锁之后才可以继续执行LockThread类的run方法,现在LockThread1 类睡醒了,需要对obj对象加锁,但是此时obj对象已经被LockThread类的run方法锁,所以LockThread1 类需要LockThread类释放了对obj对象的锁才可以继续往下执行。  但是此时就会发现LockThread类在等待LockThread1 释放obj1的锁,LockThread1 又在等待LockThread释放obj的锁,他们互相在等待,但是又互相不释放,程序就会静止在这里所以就产生了死锁。   (因为多线程是CPU快速切换的,所以这里的流程讲解都是主观判断)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值