多线程死锁问题

多线程死锁问题

死锁的定义
死锁:是操作系统或软件运行的一种状态:在多任务系统下,当一个或多个进程等待系统资源,而资源又被进程本身或其它进程占用时,就形成了死锁。
A、B两个线程同时抢占M、N两个资源,当A线程访问M资源时加了一把锁,然后再去访问N资源,但是同一时刻B线程在N资源上加了一把锁,B又要去拿M资源。

附上代码:

class BThread extends Thread{
	String name;	//人名、线程名
	
	public BThread(String name) {
		super();
		this.name = name;
	}

	@Override
	public void run() {
		if (name.equals("小明")) {
			synchronized ("刀") {
				System.out.println("小明抢到刀了,准备去抢叉子");
				synchronized ("叉子") {
					System.out.println("小明又抢到叉子了,可以开动了");
				}
			}
		}else {
			synchronized ("叉子") {
				System.out.println("小红抢到叉子了,准备抢刀");
				synchronized ("刀") {
					System.out.println("小红抢到刀,开动");
				}
			}
		}
	}
}    

死锁产生的条件

  1. 多个线程。
  2. 多个线程都需要相同的两个及以上的临界资源。
  3. 两个线程,每个线程都获取了其中的一个锁,但为了完成工作,还需对方的另一个锁。这种情况下,才会产生死锁。这种情况也称为循环等待。
  4. 不可剥夺。需等对方主动释放。

如何避免死锁

  1. 加锁顺序
  2. 加锁时限:线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁。
  3. 死锁检测

这是我学习多线程死锁时的一些了解,还有很多不足。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值