百摩网
当前位置: 首页 生活百科

面试死亡问题有哪些(面试官什么是死锁)

时间:2023-05-30 作者: 小编 阅读量: 2 栏目名: 生活百科

面试官什么是死锁目录什么是死锁?死锁产生原因?如何使用IDEA查看程序是否产生死锁?如何避免死锁?什么是死锁?死锁是一种非常严重的bug,是说多个线程同时被阻塞,线程中的一个或者多个又或者全部都在等待某个资源被释放,。

目录

什么是死锁?

死锁产生原因?

如何使用IDEA查看程序是否产生死锁?

如何避免死锁?

什么是死锁?

死锁是一种非常严重的bug,是说多个线程同时被阻塞,线程中的一个或者多个又或者全部都在等待某个资源被释放,造成线程无限期的阻塞,导致程序不能正常终止

️为了进一步说明死锁,有哲学家就餐这样的一个问题:

有一个桌子,哲学家们围成一圈,每两个哲学家中间有一支筷子

哲学家只能两件事:思考或者吃饭,思考时候就不会动筷子,吃饭时会拿起左右手旁边的筷子(先拿左后拿右)

如果有一个哲学家想吃饭,但是筷子被占用,就得等别人吃完进入思考后,才能获得筷子,等待的过程称为阻塞等待

在等待的情形中,会出现下面这样一种情况:所有人都处于等待筷子中,即所有哲学家都获取到左边的筷子,一直获取不到右边的筷子,这种情况称为死锁

死锁产生原因?

结合上述哲学家的例子,说明死锁产生的四个必要条件:

互斥使用:当资源被一个线程使用或者占用时,别的线程不能使用该资源

不可抢占:获取资源的一方,不能从正在使用资源的一方抢占掠夺资源,资源只能被使用者主动释放

请求和保持:资源请求者在请求别的资源时,同时保持对已有资源的占有

循环等待:即p1占有p2的资源,p2占有p3的资源,p3占有p1的资源,这样形成了一个等待环路

上述这四个条件满足即造成的结果就是死锁

️看这样的一段可能产生死锁的代码:

public class DeadLock {public static void main(String[] args) {Object lock1 = new Object();Object lock2 = new Object();Thread t1 = new Thread(){@Overridepublic void run() {try {synchronized (lock1){Thread.sleep(1000);synchronized (lock2){System.out.println("输出t1");}}} catch (InterruptedException e) {e.printStackTrace();}}};Thread t2 = new Thread(){@Overridepublic void run() {try {synchronized (lock2){Thread.sleep(1000);synchronized (lock1){System.out.println("输出t2");}}} catch (InterruptedException e) {e.printStackTrace();}}};t1.start();t2.start();}}

‍️说明:

t1先申请lock1,lock2,释放lock2,lock1

t2后申请lock2,lock1,释放lock1,lock2

这种情况不会产生死锁

t2先申请lock2,lock1,释放lock1,lock2

t1后申请lock1,lock2,释放lock2,lock1

这种情况也不会产生死锁

t1申请到lock1,t2申请到lock2,这样t1就申请不到lock2,t2就申请不到lock1,都等着对方释放资源,这样就产生了死锁

因为让t1,t2申请第一个锁的时候都等待了1秒,所以产生死锁的概率接近100%

运行结果:没有执行输出,产生死锁

如何使用IDEA查看程序是否产生死锁?

第一步:点击下方红圈内的Terminal

第二步:在下方命令窗口输入jconsole,然后回车

第三步:双击发生死锁对应的类

第四步:切换到线程,点击下面的检查死锁

第五步:即可看到发生死锁的线程

如何避免死锁?

死锁的产生必须满足互斥使用,不可抢占,请求和保持,循环等待这四个条件,但是只要破坏其中任意一个条件即可破坏死锁,其中最容易破坏的就是循环等待这个条件,那么如何破坏循环等待这个条件呢?

多个线程约定好一定的顺序,按照这个顺序加锁释放锁

️对上述产生死锁的代码改造:将加锁顺序都改为lock1,lock2,看看打印结果

public class DeadLock {public static void main(String[] args) {Object lock1 = new Object();Object lock2 = new Object();Thread t1 = new Thread(){@Overridepublic void run() {try {synchronized (lock1){Thread.sleep(1000);synchronized (lock2){System.out.println("输出t1");}}} catch (InterruptedException e) {e.printStackTrace();}}};Thread t2 = new Thread(){@Overridepublic void run() {try {synchronized (lock1){Thread.sleep(1000);synchronized (lock2){System.out.println("输出t2");}}} catch (InterruptedException e) {e.printStackTrace();}}};t1.start();t2.start();}}

打印结果:可以看到结果可以正常输出而不产生死锁

小伙伴们有兴趣想了解内容和更多相关学习资料的请点赞收藏 评论转发 关注我,后面会有很多干货。我有一些面试题、架构、设计类资料可以说是程序员面试必备!所有资料都整理到网盘了,需要的话欢迎下载!私信我回复【111】即可免费获取

版权声明:本文为CSDN博主「Java猿~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_58710208/article/details/124131865

    推荐阅读
  • 聊天不会冷场技巧(如何聊天不冷场)

    我们一起去了解并探讨一下这个问题吧!例如,当他向你表达他对某一件事情的看法的时候,你不要总是急着去否定他的看法。因为她们有着共同的爱好,所以可以说的事情非常的多,聊天的气氛也会越来越热烈。聊对方感兴趣的东西:可以从对方接话中得知对方的兴趣,比如玩游戏、听音乐、打球、跑步等等。了解到对方的兴趣后,即可创造兴趣话题。

  • 女生一过25 少留这4种显老发型(无论年纪多大的)

    说到发型,对于许多小仙女来说可以说非常的重视,不是有那一句话吗?

  • 兰州市限行规定最新(1月24日兰州市限行规定)

    拉运生产生活必需物资以及从事危化品、渣土运输的货运机动车需驶入上述限行区域的,须符合市政府相关政策规定,提前到兰州市政务服务中心,按规定程序审批办理电子通行证,严格按通行证规定时间和指定线路行驶。

  • 中安时评与时间赛跑(中安时评制造世界)

    中安时评与时间赛跑9月20日,2022世界制造业大会如期而至。可以看到,“智”已经成为世界制造业大会的关键词和主旋律。今年的大会,在对“制”和“智”的演绎上,有了更高阶的升级。世界制造业大会,不单单是一场安徽合肥的本土品牌盛会。一个以“智能”“智慧”“智造”为关键词,紧密关联着服务业、金融业、数字经济等多种行业的制造世界,已在安徽,这个东部省份形成规模。

  • 威海山东铝业职业学院啥时候开学(山东铝业职业学院威海校区开学)

    为保障新生顺利入学,威海南海新区各部门与学校通力协作,为新生服好务,把好关。为确保学生安全抵校,威海南海公交公司安排了51辆大客车分别奔赴威海火车站、南海新区汽车站等地迎接新生,每辆客车均有学生志愿者随行,另有志愿者在接站点协助引导工作。为解决学生及家长的住宿问题,威海南海新区文旅中心协调十余家酒店提供千余间客房,并提供学校和酒店间的往返服务。

  • 苏州工业园区星湾学校2020年秋季小学部招生简章

    本文为你带来的是苏州工业园区星湾学校2020年秋季小学部招生简章,其中包括苏州星湾学校小学部招生对象、范围、报名程序等相关信息。

  • 电烤箱烤红薯的做法(电烤箱烤红薯的做法简述)

    电烤箱烤红薯的做法买回来的红薯首先洗干净,然后晾干。烤箱调到200度,预热2分钟,这样做的原理是为了烤箱受热均匀。然后再把红薯放进烤箱中层,红薯之间要留一点儿缝隙,以免受热不均。把温度调到250度,用上下烤,然后根据红薯大小,确定烤红薯的时间,中等个头的红薯60分钟就可以,小的可以40分钟,再大的可以80分钟左右。当你听到烤箱时间到的提示音时,一定不要急着开烤箱,拔掉电源,利用烤箱余温继续烤15分钟左右。

  • mad洗面奶是什么牌子(Madam问答室敏感痘痘肌水乳)

    Madam问答室敏感痘痘肌水乳不知不觉又到了月底,天是一天比一天热,周末不想出门了,准备在家里修身养性一下哈哈哈~公众号主页回复关键词【问答室】即可查看往期问答室精彩内容哦!所推荐产品与madam均无利益关系,个人意见仅供参考,小。

  • 吃金针菇的营养(绍兴市民健康课堂)

    每天坚持吃适量的金针菇,能够抵抗疲劳,同时也消除身体中的重金属物,具有抗菌消炎以及抗肿瘤的功效。另外有一部分老年人容易出现心悸以及骨质疏松,此时选择金针菇就能够强身健体。另外在金针菇里面含有一种糖蛋白,具有消炎抗菌的功效,提高免疫系统,预防哮喘以及鼻炎等。

  • 高圆圆凭什么俘获赵又廷(高圆圆暴瘦照疯传引热议)

    据台湾媒体报道,高圆圆与赵又廷结婚4年多,感情恩爱令人称羡,然而近日网上却流传她一组出席公开活动照,让网友不敢置信“高圆圆怎么瘦成排骨精”,连赵又廷也无端中枪,被怪没有好好照顾高圆圆。日前有网友在微博曝光一系列高圆圆出席活动照,称高圆圆暴瘦2、30斤骨瘦如柴,引发不少网友担心“是为了拍新片角色需要吗?怎么这么瘦了”、“还是喜欢肉肉的圆圆”,甚至还有人怪起赵又廷“姑父没有好好照顾你吗?”