java中如何写一个死锁例子

如有转载,请申明:

转载至http://blog.csdn.net/qq_35064774/article/details/51793656


你没看错,今天是要写一个死锁程序。通过自己写一个死锁例子,就能理解为什么会发生死锁。

但在写这个程序前,是不是要知道什么情况下才会发生死锁(假装我开头没说过那句话)。我们先抛开一系列复杂的业务逻辑,单纯从语法上来分析。

死锁的定义是,两个或两个以上的线程或进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。

是不是觉得定义比较抽象,我们简化一下,就当成只有两个线程。现在有线程1和线程2。线程1执行过程中,先锁定了对象a,然后需要再锁定b才能继续执行代码;而线程2正巧相反,先锁定了b,需要再锁定a才能继续执行代码。这时,两个线程都等着对方解锁,才能继续执行,这时,两个线程就进入等待状态,最终不会有线程执行。这就变成了死锁。

接下来我们来写代码。

public class TestThread {
	public static void main(String[] args) {
// test dead lock
		Thread t9 = new Thread(
				new DeadLock(true));
		Thread t10 = new Thread(
				new DeadLock(false));
		t9.start();
		t10.start();
	}
}

class DeadLock implements Runnable{

	boolean lockFormer;
	static Object o1 = new Object();
	static Object o2 = new Object();
	DeadLock(boolean lockFormer){
		this.lockFormer = lockFormer;
	}
	
	@Override
	public void run() {
		if(this.lockFormer){
			synchronized (o1) {
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				synchronized (o2) {
					System.out.println("1ok");
				}
			}
		}else{
			synchronized (o2) {
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				synchronized (o1) {
					System.out.println("1ok");
				}
			}
		}
		
	}
}

从这个例子很容体会到,只要尽量避免加多个锁,就可以尽量避免死锁。

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值