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

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

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

面试官什么是死锁目录什么是死锁?死锁产生原因?如何使用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

    推荐阅读
  • 地雷瓜和麒麟瓜的区别(地雷瓜和麒麟瓜哪个好吃)

    地雷瓜的个头较小,形状为圆球形,形似地雷,因此被称为地雷瓜。而麒麟瓜是经过培植的科研新品种,它的形状为长椭圆形,绿底条纹清晰,从开花到收瓜需要60天左右。地雷瓜和麒麟瓜的区别地雷瓜主要在沛县张寨镇陈桥村种植,适用于城市消费,它的个头较小,瓜形为圆形,果皮较脆,但韧性很好。而麒麟瓜是经过培植的科研新品种,在海南、温州、宁夏等地广泛种植。

  • 黑白禁区邰局是好的吗(黑白禁区邰局是不是好人)

    我们一起去了解并探讨一下这个问题吧!黑白禁区邰局是好的吗《黑白禁区》中邰局是好人。邰局在淦天雷、杨晓蕾、熊国良这个铁三角中既是领导又是师傅,对他们有着不一样的意义的存在。邰局在他们面前既是领导又是师傅,这领导难做师傅更难做,实在太折腾人。

  • 骆驼的繁衍方式(自然世界就是这样奇妙)

    接下来我们就一起去了解一下吧!骆驼的繁衍方式每年的1~3月是骆驼发情季节,雄兽争斗时,主要是将头部伸到对方的两腿之间,绊倒对方后再用嘴撕咬。这时常常见到单独行动的骆驼,往往都是求偶争斗的失败者,也有发情的雄性跑到家骆驼群里,与雌性家骆驼交配的情况发生。双峰驼在繁殖期都是“一夫多妻制”,即每个种群由一峰公驼和数头母驼及未成年幼驼组成。

  • 强电解质有哪些(盘点强电解质有什么)

    强电解质有哪些硫酸,硫酸,硫的最重要的含氧酸。无水硫酸为无色油状液体,10.36℃时结晶,通常使用的是它的各种不同浓度的水溶液,用塔式法和接触法制取。盐酸的性状为无色透明的液体,有强烈的刺鼻气味,具有较高的腐蚀性。浓盐酸具有极强的挥发性,因此盛有浓盐酸的容器打开后氯化氢气体会挥发,与空气中的水蒸气结合产生盐酸小液滴,使瓶口上方出现酸雾。盐酸是胃酸的主要成分,它能够促进食物消化、抵御微生物感染。

  • 小语种的专业优势为何越来越明显(越来越热门的小语种专业)

    3、西班牙语西班牙语是联合国6种工作语种之一,除了西班牙,拉丁美洲基本通用西语,但从使用人数来说,是仅次于汉语的世界第二大语言。

  • 手机如何制作1寸证件照尺寸(六寸证件照片尺寸要求及手机拍照制作教程)

    6寸照片尺寸是152mm×102mm。照片的尺寸一般以英寸为单位,一英寸约等于2.54厘米,也就是等于25.4毫米。点击下一步按钮,从手机相册中选择拍好的原始照片,可以手工裁剪,也可以让程序帮忙自动裁剪出人物主体部分。这样一张纯色背景的六寸照片就制作好了,背景色可以在第一步选择,都是标准的证件照背景。如果需要冲印的话,可以带着电子版照片到打印店复印店,也可以在网上找一家冲印网店,告知是六寸照片就可以了。

  • 鳗鱼干怎么做好吃法(鳗鱼干的做法好吃法)

    鳗鱼干怎么做好吃法姜,香芹,大红椒切丝。锅内放油,把鳗鱼条放进去中火煎炸1分钟。翻一面继续,这里不用等1分钟,直接进行下一步。把所有辅料都放进去,不要翻锅,沿锅边洒入料酒,然后再翻炒。我这里为了拍摄效果把料酒的口子剪的比较大,这样才能拍清楚料酒。你们买那种袋装的料酒只要剪一丁点就可以哦,能挤出来一根细细的线就可以,沿着锅边绕圈洒进去,让高温把料酒蒸发掉留下酒香。加入盐,如果鳗鱼够咸盐可放可不放。

  • 醴陵陶瓷发展历史(湖南醴陵陶瓷产业开启)

    “车间采用先进的等静压全自动成型生产工艺模式生产高端日用陶瓷,与传统的日用陶瓷生产方式完全不同,这在湖南省内尚属首例,是行业领先和创新性的生产模式。”2021年出口销售额达到了3.02亿元。醴陵是中国陶瓷历史文化名城。目前,醴陵陶瓷企业自动化、智能化替代率超过70%,在全国陶瓷主产区位居前列。醴陵陶瓷业已经开启了智能制造的新未来。全国党媒信息公共平台提供信息发布传播服务。

  • 商标左上角的r和tm有什么区别(商标上的小差别)

    用圆圈R,是“注册商标”的标记,意思是该商标已在国家商标局进行注册申请并已经商标局审查通过,成为注册商标。◆“TM”和“R”的区别1.“R”商标是已注册商标,受法律严格保护,而“TM”商标不受法律保护。

  • 城市建成区面积是什么意思(城市建成区面积的含义)

    接下来我们就一起去了解一下吧!城市建成区面积是什么意思建成区面积为“城市建成区面积”的简称,是指城市行政区内实际已成片开发建设、市政公用设施和公共设施基本具备的地区的面积。中国统计部门用建成区来反映一个市的城市化区域的大小。从广义上讲,建成区是指城市行政范围内,实际建成或正在建成的、相对集中分布的地区。是城市建设发展在地域分布上的客观反映。