什么是死锁,产生死锁的必要条件,以及避免死锁的方法

article/2025/9/21 18:23:09

一、死锁的定义
        死锁是指,有两个或两个以上的线程在执行的过程中,由于竞争的资源或者彼此通信而造成的一种阻塞状态,若无外力作用,他们将都无法进行下去,从而形成一直阻塞的状态叫死锁。
        简单来说就是小李拿了东西A,小张拿了东西B,小李现在还想要东西B,小张还想要东西A,但是两个人都不放弃原来的,还要对方的,一直僵持的状态就叫死锁。

画一个图来解释一下:
在这里插入图片描述
二、产生死锁的必要条件

  1. 互斥条件
             一个资源只能被一个线程所拥有的,若一个线程已经拥有了该资源,那么其他想获取该资源的线程就需要阻塞等待。
  2. 不可剥夺条件
            当一个资源被线程获取了之后,如果该线程不主动释放该资源,那么该资源一直被占有,其他想获取该资源的线程就要一直进行等待。
  3. 请求并持有条件
            一个线程已经拥有了一个资源,还要请求新的资源。
  4. 循环等待条件
            产生死锁一定是发生了环路等待,形成线程资源环形链。

        以上是产生死锁的四个必要条件,缺一不可,产生死锁的时候这四个条件一定是都满足的,那么就表示,要想避免死锁,破坏其中一个条件即可。

三、自己实现一个死锁

public class DeadLockCSDN {public static void main(String[] args) {//资源A和BObject A = new Object();Object B = new Object();//第一个线程Thread t1 = new Thread(() -> {//先得到资源Asynchronized (A){System.out.println("线程1已经获得资源A");try {//这里线程休眠两秒是为了保证线程1拿到AThread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}//拿到A之后再去获取B资源synchronized (B){System.out.println("线程1已经获得资源B");}}});//第二个线程Thread t2 = new Thread(() -> {//先获得资源Bsynchronized (B){System.out.println("线程2已经获得资源B");try {//保证线程2 获得资源BThread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}//再去请求获得A资源synchronized (A){System.out.println("线程2已经获得资源A");}}});t1.start();t2.start();}
}

运行结果:
在这里插入图片描述
        我们可以看到线程1和线程2都分别获得了A资源和B资源,但是都没有得到自己第二个想获得的资源,我们的程序也一直没有退出。没有变化,就是因为形成了死锁,大家僵持在了一起。

四、避免死锁
        我们知道形成死锁的四个条件分别是:互斥条件、不可剥夺条件、请求并持有条件、循环等待条件,那么我们看这四个条件,互斥条件和不可剥夺条件是我们没有办法改变的,请求并持有条件可以改变但是我们就是想实现,每个线程都能获得两个资源的情况,所以我们只能去打破循环等待条件了,那么打破循环等待条件就是让两个线程之间获取资源的顺序不要穿插在一起,可以让一个线程先获得两个资源,使用完毕后释放,另一个线程再获取这两个资源,就可以保证两个线程都能正常执行。
画个图解释一下:
在这里插入图片描述
        用代码实现一下这个过程:

public class DeadLockCSDN {public static void main(String[] args) {//资源A和BObject A = new Object();Object B = new Object();//第一个线程Thread t1 = new Thread(() -> {//先得到资源Asynchronized (A){System.out.println("线程1已经获得资源A");try {//这里线程休眠两秒是为了保证线程1拿到AThread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}//拿到A之后再去获取B资源synchronized (B){System.out.println("线程1已经获得资源B");}}});//第二个线程Thread t2 = new Thread(() -> {//先获得资源Asynchronized (A){System.out.println("线程2已经获得资源A");try {//保证线程2 获得资源BThread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}//再去请求获得B资源synchronized (B){System.out.println("线程2已经获得资源B");}}});t1.start();t2.start();}
}

运行结果:
在这里插入图片描述
        程序正确执行并退出!我们将线程2获得资源的顺序变成和线程1一样的这样就不会出现资源循环等待了,打破了循环等待条件,也就避免了死锁,程序就可以正常执行,线程1和线程2都获得了原本想获得的两个资源。


http://chatgpt.dhexx.cn/article/XXYlJS1C.shtml

相关文章

死锁产生的四个必要条件?如何避免和预防死锁产生?

一、什么是死锁? 两个线程或两个以上线程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是这些线程都陷入了无限的等待中,这就是死锁。 举个例子:如果线程1锁住了A,然后尝试对B进行加锁,同时线程2已…

死锁产生的原因和必要条件详解

3.5 产生死锁的原因和必要条件 在多道程序系统中,虽借助于多个进程的并发执行,改善了系统的资源利用率,提高了系统的吞吐量,但可能发生一种危险——死锁。 死锁(deadlock): 是指多个进程在运…

死锁概念,死锁产生的四个必要条件,如何避免和预防死锁

一、死锁概念 死锁是指两个或多个进程在执行的过程中,因为竞争资源而造成互相等待的现象,若无外力作用,它们都无法推进下去。 1.在等待对方时占有不可抢占的资源 举个例子,假设有P1,P2两个进程,都需要A和…

关于死锁,死锁的四个必要条件的总结

什么是死锁? 死锁,指的是多个进程再运行期间因争夺资源而产生的一种僵局,若无外力作用(破坏死锁),程序将无法运行。 死锁产生的四个必要条件 互斥条件: 进程要求对所分配的资源(如…

死锁产生的四个必要条件

一、死锁产生的四个必要条件 互斥条件:资源是独占的且排他使用,进程互斥使用资源,即任意时刻一个资源只能给一个进程使用,其他进程若申请一个资源,而该资源被另一进程占有时,则申请者等待直到资源被占有者…

什么是死锁?死锁发生的四个必要条件是什么?如何避免和预防死锁产生?

什么是死锁? 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程…

死锁和产生死锁的四个必要条件以及如何避免和预防死锁

什么是死锁 如果一组进程中的每一个进程都在等待仅由该组进程中的其它进程才能引发的事件,那么该组进程就是死锁的。 死锁出现的场景 (1)多个线程:彼此申请对方资源而导致的死锁。A申请B的资源时,因为资源被占用&am…

理解死锁产生的四个必要条件

死锁的定义 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进…

死锁,死锁的四个必要条件以及处理策略

一、什么是死锁二、死锁与饥饿三、资源的类型 3.1 可重用资源和消耗性资源 3.1.1 可重用资源(永久性资源)3.1.2 消耗性资源(临时性资源) 3.2 可抢占资源和不可抢占资源 3.2.1 可抢占资源3.2.2 不可抢占资源 四、死锁产生的原因 4…

死锁产生的四个必要条件(缺一不可)

死锁产生必须同时满足四个条件,只要其中任意一条不成立,死锁就不会发生。 1、互斥条件:进程要求对所分配的资源进行排他性控制,即在一段时间内某项资源只被 一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。如图一 2、非抢占:进程所获得的额资源在未使…

死锁的四个必要条件

死锁在高并发中是一个常见的名词。产生的四个必要条件如下: 互斥条件:一个资源同一时间能且只能被一个线程访问; 不可掠夺:当资源被一个线程占用时,其他线程不可抢夺该资源; 请求与等待:当资源被…

div在html垂直居中,div 垂直居中(css div水平垂直居中六种方法)

div垂直居中 div垂直居中代码示例如下: 前台效果如下图所示: 如图所示,div中的文字垂直居中。其中主要的属性就是line-height。 line-height属性设置行间的间隔(行高即垂直方向)。 line-height属性会影响行框的规划。在应用到一个块级元素时&…

使用css3将一个div水平和垂直居中显示

使用css3将一个div水平和垂直居中显示 方案一: div绝对定位水平垂直居中【margin:auto实现绝对定位元素的居中】, 代码两个关键点:1.上下左右均0位置定位; 2.margin: auto; 其width、height如何更改都是居中显示的,兼容…

CSS 实现DIV水平垂直居中(二)

CSS 实现DIV垂直居中 上期介绍了CSS实现div水平居中的五种方法,下面介绍CSS实现div垂直居中的几种方法。上篇:CSS 实现DIV水平居中 首先还是和上期同样的两个div盒子,以下方法实现div垂直居中,效果如图: 1.通过padding上下留白实…

div中的内容水平垂直居中

1. div高度自适应的情况 div在不设置高度的时候,会被里面的内容撑开,内容自动填充在div中,无论是一行内容还是多行内容,此时不需要设置垂直居中,内容自动在中间的, 想要看的更直观些,只需要加上…

Div水平垂直居中

(1)父元素设置弹性盒子display:flex; 再加上justify-content:center;align-items:center; 推荐 (2)使用top:50% left:50% 以及margin-top 和 margin-left 来进行定位 注意: 必须知道盒子的具体的宽和高,否…

html 中div垂直居中的三种方式

1、第一种&#xff1a; <style type"text/css"> <!-- .con_div{ width:400px; height:300px; border:1px solid #777; text-align:center; display:table-cell; vertical-align:middle; background:red; color:#fff; lin…

如何让一个div水平垂直居中

在工作中 经常会碰到让一个div框针对某个模块水平垂直居中 针对这种情况 有多种方法 现在一一实现一下 一. div绝对定位水平垂直居中 margin 负间距 代码: .box {width: 200px;height: 200px;background: yellow;position: absolute;left: 50%;top: 50%;margin-left: -100px;m…

CSS实现DIV垂直水平居中

CSS实现DIV垂直水平居中 在页面设计中&#xff0c;很多地方都需要div的垂直水平居中&#xff0c;在前端开篇的学习中&#xff0c;也是使用较多的地方&#xff0c;所以我整理了三种方法帮助大家去解决问题&#xff0c;代码可直接使用&#xff0c;仅供参考学习。 方法 方法一&a…

div文字垂直居中的方法有哪些?

首先我们应该知道文字的水平居中比较简单,行级元素设置其父元素的text-aligncenter,块级元素设置其本身的left和rightmargins为auto即可。但是div文字的垂直居中就不是那么简单了,所以我们就来具体看看div文字垂直居中的几种实现方法。 1、vertical-align属性让文字居中 ver…