关于死锁

死锁是指两个或多个进程在争夺资源时形成的僵局,无法自行解脱。本文详细介绍了死锁的定义、原因、四要素以及处理死锁的各种方法,包括预防和避免策略,如破坏四个必要条件、银行家算法、加锁顺序、超时机制和死锁检测等。
摘要由CSDN通过智能技术生成

什么是死锁

死锁是指两个或两个以上的进程在运行过程中因争夺资源而造成的一种僵局,若无外力作用,这些进程都将无法向前推进。

死锁的原因

  • 竞争不可抢占资源引起死锁
    通常系统中拥有的不可抢占资源,其数量不足以满足多个进程运行的需要,使得进程在运行过程中,会因争夺资源而陷入僵局,如磁带机、打印机等。只有对不可抢占资源的竞争才能产生死锁。
  • 竞争可消耗资源引起死锁
  • 进程推进顺序不当引起死锁
    进程在运行过程中,请求和释放资源的顺序不当,也同样会导致死锁。例如,并发进程 P1、P2分别保持了资源R1、R2,而进程P1申请资源R2,进程P2申请资源R1时,两者都会因为所需资源被占用而阻塞。
    信号量使用不当也会造成死锁。进程间彼此相互等待对方发来的消息,结果也会使得这 些进程间无法继续向前推进。例如,进程A等待进程B发的消息,进程B又在等待进程A 发的消息,可以看出进程A和B不是因为竞争同一资源,而是在等待对方的资源导致死锁。

死锁四要素(必要条件)

互斥

进程要求对所分配的资源进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待,如果A进程持有a资源,请求b资源,B进程持有b资源,请求a资源,相互等待就会造成死锁。

不可剥夺

进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程来释放(持有资源的进程主动释放)。

请求与保持

进程已经保持了至少一个资源(A),但又提出了新的资源(B)请求,而该资源(B)已被其他进程占有,该进程会被阻塞而无法释放资源(A)。

循环等待

当两个进程相互等待时我们很容易就能观察来,但是如果多个进程相互等待形成闭环就很难观察出来。循环等待打破方式:
在这里插入图片描述
图2-16中向我们展现了另一种循环等待,Pn在等待P0和PK资源的释放,而PK是不属于闭环的,只要PK释放了资源,就能打破循环等待的局面。

两个线程互相等待资源的例子

public class 等待死锁 implements Runnable {
  public int flag= 1;
  //静态对象是类的所有对象共享的
  private static Object o1=new Object();
  private static Object o2=new Object();
  
	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("flag="+flag);
		if (flag==1) {
			//给对象o1上同步锁独享
			synchronized (o1) {
				try {
					Thread.sleep(500);
				} catch (Exception e) {
					// TODO: handle exception
					e.printStackTrace();
				}
			}
			//给对象o2上同步锁独享
			synchronized (o2) {
				System.out.println("1");
			}
		}
		if (flag==0) {
			synchronized (o2) {
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch b
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值