多线程编程(一)——写一个简单的死锁

(整个九月忙着找工作,好多收获,好多遗憾,最终结局还可以接受,技术路还很远,再接再厉!面去哪儿网时,写惯了算法的我突然让写了几个多线程编程,有点蒙蔽,最近好好整理一下)

死锁发生的原因:

1、系统资源有限

2、进程或线程推进顺序不恰当

3、资源分配不当

死锁发生的四个条件:

1、互斥条件:一份资源每次只能被一个进程或线程使用(在Java中一般体现为,一个对象锁只能被一个线程持有)

2、请求与保持条件:一个进程或线程在等待请求资源被释放时,不释放已占有资源

3、不可剥夺条件:一个进程或线程已经获得的资源不能被其他进程或线程强行剥夺

4、循环等待条件:形成一种循环等待的场景

下面看代码:

public class A {
	public synchronized void waitMethod(B b) throws InterruptedException{
		System.out.println(Thread.currentThread().getName() + ":正在执行a的等待方法,持有a的对象锁");
		Thread.sleep(2000L);
		System.out.println(Thread.currentThread().getName() + ":试图调用b的死锁方法,尝试获取b的对象锁");
		b.deadLockMethod();
	}
	
	public synchronized void deadLockMethod(){
		System.out.println(Thread.currentThread().getName() + ":正在执行a的死锁方法,持有a的对象锁");
	}
}
public class B {
	public synchronized void waitMethod(A a) throws InterruptedException{
		System.out.println(Thread.currentThread().getName() + ":正在执行b的等待方法,持有b的对象锁");
		Thread.sleep(2000L);
		System.out.println(Thread.currentThread().getName() + ":试图调用a的死锁方法,尝试获取a的对象锁");
		a.deadLockMethod();
	}
	
	public synchronized void deadLockMethod(){
		System.out.println(Thread.currentThread().getName() + ":正在执行B的死锁方法,持有B的对象锁");
	}
}
public class TestDeadLock implements Runnable {

	A a = new A();
	B b = new B();
	
	public void init() throws InterruptedException{
		Thread.currentThread().setName("主线程");
		a.waitMethod(b);
	}
	
	@Override
	public void run() {
		Thread.currentThread().setName("副线程");
		try {
			b.waitMethod(a);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) throws InterruptedException{
		TestDeadLock testDeadLock = new TestDeadLock();
		Thread thread = new Thread(testDeadLock);
		thread.start();	
		testDeadLock.init();
	}
}
通过sleep()方法,可以实现主线程持有a的对象锁并请求b的对象锁、 副线程持有b的对象锁并请求a的对象锁的场景,即发生死锁。

效果如下:





  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值