死锁详解:常见死锁案例、条件,如何避免出现死锁?

死锁的成因和对应的解决方案 什么!!!快面试了🤔,这些死锁问题你还不清楚吗😎? 阅读详情

一、什么是死锁

死锁不仅在个人学习中,甚至在开发中也并不常见。但是一旦出现死锁,后果将非常严重。首先什么是死锁呢?打个比方,就好像有两个人打架,互相限制住了(锁住,抱住)彼此一样,互相动弹不得,而且互相欧气,你不松手我就不松手。好了谁也动弹不得。

在多线程的环境下,势必会对资源进行抢夺。当两个线程锁住了当前资源,但都需要对方的资源才能进行下一步操作,这个时候两方就会一直等待对方的资源释放。这就形成了死锁。这些永远在互相等待的进程称为死锁进程。

那么我们来总结一下死锁产生的条件:

互斥:资源的锁是排他性的,加锁期间只能有一个线程拥有该资源。其他线程只能等待锁释放才能尝试获取该资源。

请求和保持:当前线程已经拥有至少一个资源,但其同时又发出新的资源请求,而被请求的资源被其他线程拥有。此时进入保持当前资源并等待下个资源的状态。

不剥夺:线程已拥有的资源,只能由自己释放,不能被其他线程剥夺。

循环等待:是指有多个线程互相的请求对方的资源,但同时拥有对方下一步所需的资源。形成一种循环,类似2)请求和保持。但此处指多个线程的关系。并不是指单个线程一直在循环中等待。

什么?还是不理解?那我们直接上代码,动手写一个死锁。

二、写一个死锁

根据条件,我们让两个线程互相请求保持。

/**
 * 模拟死锁场景
 */
public class DeadLockDemo implements Runnable{

    public static int flag = 1;

    //static 变量是 类对象共享的
    static Object o1 = new Object();
    static Object o2 = new Object();

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + ":此时 flag = " + flag);
        if(flag == 1){
            synchronized (o1){
                try {
                    System.out.println("我是" + Thread.currentThread().getName() + "锁住 o1");
                    Thread.sleep(3000);
                    System.out.println(Thread.currentThread().getName() + "醒来->准备获取 o2");
                }catch (Exception e){
                    e.printStackTrace();
                }
                synchronized (o2){
                    System.out.println(Thread.currentThread().getName() + "拿到 o2");//第24行
                }
            }
        }
        if(flag == 0){
            synchronized (o2){
                try {
                    System.out.println("我是" + Thread.currentThread().getName() + "锁住 o2");
                    Thread.sleep(3000);
                    System.out.println(Thread.currentThread().getName() + "醒来->准备获取 o1");
                }catch (Exception e){
                    e.printStackTrace();
                }
                synchronized (o1){
                    System.out.println(Thread.currentThread().getName() + "拿到 o1");//第38行
                }
            }
        }
    }

    public static  void main(String args[]){

        DeadLockDemo t1 = new DeadLockDemo();
        DeadLockDemo t2 = new DeadLockDemo();
        t1.flag = 1;
        new Thread(t1).start();

        //让main线程休眠1秒钟,保证t2开启锁住o2.进入死锁
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        t2.flag = 0;
        new Thread(t2).start();
    }

代码中,

t1创建,t1先拿到o1的锁,开始休眠3秒。然后

t2线程创建,t2拿到o2的锁,开始休眠3秒。然后

t1先醒来,准备拿o2的锁,发现o2已经加锁,只能等待o2的锁释放。

t2后醒来,准备拿o1的锁,发现o1已经加锁,只能等待o1的锁释放。

t1,t2形成死锁。

我们查看运行状态

三、发现排查死锁情况

我们利用jdk提供的工具定位死锁问题:

jps显示所有当前Java虚拟机进程名及pid.

jstack打印进程堆栈信息。

列出所有java进程。

我们检查一下DeadLockDemo,为什么这个线程不退栈。

jstack 11170

我们直接翻到最后:已经检测出了一个java级别死锁。其中两个线程分别卡在了代码第27行和第41行。检查我们代码的对应位置,即可排查错误。此处我们是第二个锁始终拿不到,所以死锁了。

在这里插播一下,还是有很多朋友对死锁不了解,为了让大家在之后的学习或者工作中避免出现死锁不知道该如何解决。我在这里写一些常见的死锁是怎么产生的便于大家避免,遇到相似的情况可以很好的解决。后续也会持续更新Java的其它知识点和面试方法资料等等...感兴趣的铁汁们可以持续关注我

常见的死锁是如何产生的,如何避免
概述:
什么场景下回发生 00060 死锁问题:
​ 一般情况下,数据库自身发生死锁的情况很少,一般情况都是因为应用本身调用问题导致的 00060异常 。

​ 比如说有两个会话sid,分别为 138 和136,这两个会话都要对 6677 和 7788 两个人加工资,但是执行的顺序不一样,操作分别是:

-- 会话session号 Session 1 (sid = 136), Session 2 (sid = 138)

-- 执行的语句 Session 1 (sid = 136)
update emp set sal=sal+100 where empno=6677; 
update emp set sal=sal+100 where empno=7788;

-- 执行的语句 Session 2 (sid = 138)
update emp set sal=sal+100 where empno=7788; 
update emp set sal=sal+100 where empno=6677;


ORA-00060:deadlock detected while waiting for resource
这样我们就成功的触发了一个ORA-00060。

出现这个问题,我们可以查看Oracle日志,日志路径:$ORACLE_BASE/diag/rdbms/org11/ora11/trace/alert*.log

可以从告警日志中看到很多类似如下的日志:

ORA-00060:Deadlock detected.More info in file

ORA-00060:Deadlock detected.More info in file /home1/oracle/diag/rdbms/ora11g/ora11g/trace/ora11g_ora_14757.trc


我们看下对饮的trc日志,主要看Deadlock graph,其中:可以看到136和138互相死锁,session 138(也就是 session2,sid=138)等着要 ROWID=AAAMfAAAAgAAA的行锁,而 session136(也就是 session1,sid=136)等着要ROWID=AAAMfPAAEAAAAgAAL 的行。

处理方式:
1. 给资源编号,然后按照固定的顺序进行访问。
​ 简单的来说,就是先改编号小的,在改编号大的。当然,反着来也可以。

-- 会话session号 Session 1 (sid = 136), Session 2 (sid = 138)

update emp set sal=sal+100 where empno=6677; 
update emp set sal=sal+100 where empno=7788;

Waiting...

update emp set sal=sal+100 where empno=7788; 

commit/rollback;

update emp set sal=sal+100 where empno=6677;


​ 在这里,工资增加两次,但是 session 2 被 session 1 阻塞了,对于用户体验来说,感受不好。

​ 如果 session 1 一直不结束事务,session 2 只能一直等下去,这样比deadlock 后,Oracle 程序本身出面调停还要糟糕。

2. 可以在 select … for update nowait 语句测试一下需要更改的行是否被锁定
​ 如果没有被锁定,那这个语句会马上给这行加锁,如果已经加锁那就马上返回:ORA-00054:resource busy and acquire with NOWAIT specified ,如下表所示:

-- 会话session号 Session 1 (sid = 136), Session 2 (sid = 138)

select * from emp where empno in(6677,7788) for update nowait;

select * from emp where empno in(6677,7788) for update nowait;

ORA-00054:resource busy and acquire with NOWAIT specified

update emp set sal=sal+100 where empno=6677; 
update emp set sal=sal+100 where empno=7788;


方法一和方法二都存在一定的问题,特别是在ND代码中如果使用方法二那么修改起来工作量太大,但是如果我们不处理,Oracle有自动检测死锁并且回滚事务的功能,也就是说之前的会话中136 和138 有一个会成功,一个会回滚,返回失败,这样就保证了数据的一致性。

总结:
对应上面两处处理方式。感觉都不好,毕竟现网这种场景较少。而且这种死锁不是永久性的一直卡死在这,Oracle会检测到这种死锁的,并且检测到后会自己回滚,所以直接交给Oracle即可。

附相关的查询SQL:
1.查询死锁:

select t2.username,t2.sid,t2.seria#,t2.logon_time 
from v$locked_object t1,v$session t2 
where t1.session_id = t2.sid 
order by t2.logon_time;


2.根据 sid 查询对应的SQL语句,比如第一点查询出 sid 为136 和138 的死锁结果:

 select sql_text
from v$session a,$sqltext_with_newlines b
where DECODE(a.sql_hash_value,0,prev_hash_value,sql_hash_value) = b.hash_value and a.sid in ('136','138')
order by piece;


3.查看处于等待状态的SQL语句:

select a.spid,c.EVENT,b.LOGON_TIME,d.SQL_TEXT,a.PROGRAM
from v$process a,v$session b,v$session_wait c,v$sql d
where a.ADDR = b.PADDR and b.SID = c.SID 
  and b.SQL_HASH_VALUE = D.HASH_VALUE
  and c.EVENT NOT LIKE '%SQL*Net%'
  and c.EVENT NOT LIKE '%smon%'
  and c.EVENT NOT LIKE '%jopq%'
  and c.EVENT NOT LIKE '%ipc%'


4.查看目前是否有“长时间持有锁未释放”,必要的情况下可以用对应的 command 杀死 session:

select I.BLOCK,ILMODE,I.REQUEST,I.TYPE,I.ID1,I.CTIME,s.SID,s.SERIAL#,
T.SQL_TEXT,p.SPID,'ALTER SYSTEM KILL SESSION'"||S.SID||','||s.serial#||"',' Command
from v$lock i,v$SESSION s,v$SQL t,v$process p 
where I.ID1 in (select id1 from v$lock where block = 1)
  and I.SID = s.SID and (t.hash_value = DECODE(s.sql_hash_value,0,s.prev_hash_value,s.sql_hash_value))
  and t.address = DECODE(a.sql_hash_value,0,s.prev_hash_addr,s.sql_address))
  and p.ADDR = s.PADDR
order by I.ID1,I.CTIME desc;
 


5.杀死进程(396为sid,60589为serial#),该条可以结合第一点进行:

alter system kill session '396,60589';

四、解决办法

死锁一旦发生,我们就无法解决了。所以我们只能避免死锁的发生。
既然死锁需要满足四种条件,那我们就从条件下手,只要打破任意规则即可。

(互斥)尽量少用互斥锁,能加读锁,不加写锁。当然这条无法避免。
(请求和保持)采用资源静态分配策略(进程资源静态分配方式是指一个进程在建立时就分配了它需要的全部资源).我们尽量不让线程同时去请求多个锁,或者在拥有一个锁又请求不到下个锁时,不保持等待,先释放资源等待一段时间在重新请求。
(不剥夺)允许进程剥夺使用其他进程占有的资源。优先级。
(循环等待)尽量调整获得锁的顺序,不发生嵌套资源请求。加入超时。

本文到此结束啦,喜欢的铁子们可以点点赞和关注, 文章持续更新,也可以评论出你想看哪一块技术。铁子们的支持是我的动力,创作离不开铁子们的支持,在此先感谢大家!有需要资料的铁子也可以私信我即可

Java开发之——线程面试篇:死锁和如何避免死锁? 在面试的时候在问起线程锁的部分,经常被问到“什么是死锁”、“怎么避免死锁”之类的问题,甚至开发中在使用锁的时候因为逻辑不严谨导致出现程序无法正确终止或者执行的情况,这些都跟死锁有着不可分割的联系,这篇文章我们就来说说死锁的问题。 什么是死锁 死锁就是当两个或两个以上的线程因竞争相同资源而处于无限期的等待,这样就导致了多个线程的阻塞,出现程序无法正常运行和终止的情况。 举个例子说明下死锁的现象:小明和小张要玩一个玩具,这个玩具有两部分组成必须两部分组装起来才能玩,小明拿了第一部分,小张拿了第二部分;这时. 阅读详情

相关推荐

死锁-经典案例银行家算法

1.什么是死锁 现实社会中,男女双方都在等待对方先道歉,如果双方都这样固执的等待对方先开口,弄不好,就分手了 在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。 尽管死锁很少发生,但一旦发生就会造成应用的停止响应。下面看一个死锁的例子:有两个人分别做“西兰花”和“红烧肉”,每个人都需要“铲子”和“锅”之后才能炒 菜。 程序如下: ...

weixin_43641304的博客 1034

PostgreSQL 死锁问题分析与优化

根据提供的报错信息和我搜索到的资料,PG数据库报错"deadlock detected"是由于两个事务(Process 3913996和Process 28657)在执行DELETE操作时相互等待对方持有的锁,导致死锁。从我搜索到的资料中,我们可以推断,在需要确保所有应用遵循一致的锁获取顺序以避免死锁的场景下,无论是咨询锁还是表级锁,只要它们能够被正确地管理并遵循一致的获取顺序,理论上都能有效避免死锁。建议在代码中尽量以一致的顺序获取对象上的锁,避免事务中SQL交互执行,从而降低死锁发生的概率。

喝醉酒的小白 3793

什么是死锁?如何产生死锁?死锁的必要条件?怎么解决死锁?

什么是死锁?如何产生死锁?死锁是一个非常让程序猿烦恼的问题,一旦所写的程序有了死锁,那么程序就无法执行下去,会出现严重的 bug,并且死锁非常隐蔽,我们不会轻易发现它,在开发阶段,不经意期间我们就会写出死锁,很难检测出来。那么什么是死锁呢?竟然让我们如此烦恼。“死锁”就是2个或2个以上的线程互相持有对方想要的资源,导致各自处于阻塞等待状态,致使程序无法执行下去,这就是“死锁”。简单来说:一共有两个线程两把锁,T1线程拿到了A锁,T2拿到了B锁,但是T1还想要B锁,T2还像要A锁,谁也不释放锁,就会产生死锁。

m0_65992672的博客 1684

Cause: org.postgresql.util.PSQLException: ERROR: deadlock detected 检测到死锁异常排查处理

报错内容如下: org.springframework.dao.DeadlockLoserDataAccessException: ### Error querying database. Cause: org.postgresql.util.PSQLException: ERROR: deadlock detected 详细:Process 7372 waits for ShareLock on transaction 46061491; blocked by process 4624. Pro

weixin_40903055的博客 6965

Python批量注册脚本开发详细

开发一个Python批量注册脚本需要考虑多个方面,包括目标网站的注册流程、验证码处理、请求发送、数据存储等。以下是一个详细的开发流程和代码示例,用于实现基本的批量注册功能。

nsp202505的博客 3346

别再只用三次多项式了!用MATLAB手把手教你搞定七次多项式轨迹规划(附完整代码)

本文详细介绍了七次多项式在轨迹规划中的优势与应用,通过MATLAB实现从理论推导到实际代码的全过程。相比传统的三次多项式,七次多项式能精确控制位置、速度、加速度和加加速度,实现更平滑的运动控制,特别适用于工业机器人和数控机床等高精度场景。文章包含完整的MATLAB代码示例和优化技巧,帮助工程师快速掌握这一高级轨迹规划方法。

weixin_30872337的博客 297

死锁详解:常见死锁案例、条件,如何避免出现死锁?

对应上面两处处理方式。感觉都不好,毕竟现网这种场景较少。而且这种死锁不是永久性的一直卡死在这,Oracle会检测到这种死锁的,并且检测到后会自己回滚,所以直接交给Oracle即可。

m0_73849256的博客 358

ChatGPT设置密钥后Codex免手机验证:配置顺序与身份凭证复用机制

API Key 是一种用于身份识别的凭证,其核心原理是通过预配置的密钥替代交互式登录流程。在开发工具中,密钥认证优先级通常高于会话认证,当本地存在有效密钥时,工具会直接复用该凭证,从而减少重复验证环节。这种机制的技术价值在于提升开发效率与配置一致性,尤其适用于多设备切换、CI/CD 流水线及编程辅助工具等场景。以 Codex 为例,在 ChatGPT 界面提前配置 API 密钥后,Codex 启动时可读取持久化存储的密钥,避免触发手机号验证,实现身份凭证的跨入口复用。

weixin_33940469的博客 470

MySQL死锁,死锁产生的4个必要条件,死锁案例, 如何避免死锁

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

weixin_44797327的博客 2432

【嵌入式底层知识修炼】按键和LED共用IO口的分时复用扫描方法

文章目录01 - PCB原理图例程02 - 分时复用的注意项和设计2.1 - 注意项2.2 - 设计03 - 代码实现 只要我跑的速度够快,寂寞就追不上我 只要Key和Led切换速度够快,人眼就看不出来 ————小白   如果你存在按键Key和显示Led共用同一个IO时,需要分时复用的需求,则可以移植代码进行使用: 代码所占code少于0.5K 线程安全,中断安全 可移植性高,配置容易 注意:系统需要存在一个至少为1ms的时钟中断 01 - PCB原理图例程   举2个Key和Led共用IO口的

单眼皮根号三的博客 1万+

MIPI DPHY接口(基于Xilinx FPGA实现)案例分析

在Xilinx FPGA实现MIPI DPHY接口的案例(包括CIS协议层)。截止目前为止,Xilinx仅在Ultrascale+及其以上版本的FPGA IO可直接支持MIPI 电平输入,其他的,都需要转换成LVDS来接收。

ONEFPGA的博客 5625

死锁的四个必要条件

死锁产生的四个必要条件 互斥条件:资源是独占的且排他使用,进程互斥使用资源,即任意时刻一个资源只能给一个进程使用,其他进程若申请一个资源,而该资源被另一进程占有时,则申请者等待直到资源被占有者释放。 不可剥夺条件:进程所获得的资源在未使用完毕之前,不被其他进程强行剥夺,而只能由获得该资源的进程资源释放。 请求和保持条件:进程每次申请它所需要的一部分资源,在申请新的资源的同时,继续占用已分配到的资源。

Hyacinth_Dy 12万+

【法如faro】三维激光软件Scene2023数据处理(自动配准并转换坐标)流程

法如faro Scene2023数据处理(自动配准并转换坐标)的主要流程为:新建项目、导入数据、处理、自动注册、坐标系转换、模型导出立和面模型导出等。

智慧空间实验室 2383

Linux产生死锁的必要条件和常见的锁种类

Linux产生死锁的必要条件和常见的锁种类

wtl666_6的博客 6326

华为OD机试双机位B卷 - 比赛的冠亚季军 (C++ & Python & JAVA & JS & GO)

华为OD机试双机位B卷 比赛的冠亚季军,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。 华为OD机试 比赛的冠亚季军

qq_45776114的博客 703

具身智能(26):RDK S100的LeRobot或Agile X piper机械臂控制模型

本文档详细介绍了基于ROS2的机器人控制模型架构与标定数据联动机制。核心采用"感知-规划-控制"闭环流程,通过激光雷达、相机和IMU的融合数据实现厘米级定位(≤1cm)。文档包含两大控制模型配置:1)RDKLeRobot模型,重点说明PID参数调节和标定文件路径设置;2)AgileXPiper模型,强调驱动安装与外部标定文件集成。针对常见问题提供解决方案,如控制指令无响应需验证标定路径,运动偏差过大需重新标定等。最后给出批量部署方案,通过复制基准配置文件实现多机器人快速配置,要求定位偏差

码农17年的博客 179

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

什么是死锁 如果一组进程中的每一个进程都在等待仅由该组进程中的其它进程才能引发的事件,那么该组进程就是死锁的。 死锁出现的场景 (1)多个线程:彼此申请对方资源而导致的死锁。A申请B的资源时,因为资源被占用,A会被挂起等待B释放资源,同时B申请A的资源,因资源被占用B挂起等待A释放资源,而AB都处于挂起状态又无法释放资源,便形成了死锁。 (2)单个线程:A有自己的资源,但还要申请新的资源,...

ypt 2万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

MySQL死锁了怎么办(死锁的产生及解决方案),死锁的案例,死锁的排查,死锁的解决,如何避免死锁的发生

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

weixin_44797327的博客 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

进程死锁详解(定义,死锁原因,死锁条件,死锁处理方法)

一:什么是进程死锁1:定义:如果多个进程同时占有对方需要的资源而同时请求对方的资源,而在它们得到请求之前是不会释放自己所占有的资源,那么就会导致死锁的产生,也就是进程不能实现同步。2:进程是具有一个独立功能的程序关于某个数据集合的一次运行活动。其基本状态有三种,即ready(就绪),runing(运行),wait(等待)。3:死锁是指,在两个或多个并发进程中,如果每个进程持有某种资源而又等待别的进...

leikun153的博客 7376

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

在多道程序系统中,虽借助于多个进程的并发执行,改善了系统的资源利用率,提高了系统的吞吐量,但可能发生一种危险——死锁。 死锁(deadlock): 是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种状态时,若无外力作用,它们都将无法再向前推进。

loveCC_orange的博客 1万+

死锁产生的条件和处理死锁的方法

死锁是什么死锁(Deadlock)就是指两个或两个以上的进程在执行的过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去,此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。死锁发生的条件若可能发生死锁,则必定要出现三个条件:1. 互斥条件: 指进程对所分配的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它

春风来不来的博客 7340

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

一、什么是死锁 二、死锁与饥饿 三、资源的类型 3.1 可重用资源和消耗性资源 3.1.1 可重用资源(永久性资源) 3.1.2 消耗性资源(临时性资源) 3.2 可抢占资源和不可抢占资源 3.2.1 可抢占资源 3.2.2 不可抢占资源 四、死锁产生的原因 4.1 竞争不可抢占资源引起死锁 4.2 竞争可消耗资源引起死锁 4.3 进程推进顺序不当引起死锁 五、产生死锁的四个必...

wenlijunliujuan的专栏 10万+

死锁的产生条件、死锁的处理方法

一、死锁产生的四个必要条件 死锁就是多个并发进程因争夺系统资源而产生相互等待的现象。 互斥条件:进程对所分配到的资源不允许其他进程访问,若其他进程访问该资源,只能等待,直至占有该资源的进程使用完成后释放该资源。 请求和保持条件:进程获得一定的资源后,又对其他资源发出请求,但是该资源可能被其他进程占有,此时请求阻塞,但该进程不会释放自己已经占有的资源。 不可剥夺条件:进程已获得的资源,在未完成使用之前,不可被剥夺或不能被其他进程强行夺走,只能在使用后自己释放。 循环等待条

qq_41126178的博客 7552

死锁产生的四个必要条件

一、死锁产生的四个必要条件 互斥条件:资源是独占的且排他使用,进程互斥使用资源,即任意时刻一个资源只能给一个进程使用,其他进程若申请一个资源,而该资源被另一进程占有时,则申请者等待直到资源被占有者释放。 不可剥夺条件:进程所获得的资源在未使用完毕之前,不被其他进程强行剥夺,而只能由获得该资源的进程资源释放。 请求和保持条件:进程每次申请它所需要的一部分资源,在申请新的资源的同时,继续占用已分...

yaojunjie2010 6820

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

什么是死锁? 死锁,指的是多个进程再运行期间因争夺资源而产生的一种僵局,若无外力作用(破坏死锁),程序将无法运行。 死锁产生的四个必要条件 互斥条件: 进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。 不可剥夺条件: 进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。 请求与保持条件: 当进程因请求资源而阻塞时,对已获得的资源保持不放。 循环等待条件: 在发生死锁时,必然存在一个进程–资源的环形链。

牧码人的博客 3717
上一篇: 大厂的Java面试可以直接让你怀疑人生,这些面试题目你有遇到过?
下一篇: Java面试攻略,跳槽、面试很简单
在酒吧写代码
博客等级 码龄7年 210粉丝 330原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值