广告
返回顶部
首页 > 资讯 > 后端开发 > Python >java并发编程死锁定义及如何避免死锁
  • 377
分享到

java并发编程死锁定义及如何避免死锁

2024-04-02 19:04:59 377人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录场景模拟分析场景一:狭路相逢场景二:冷战场景三:哲学家就餐场景四:竞争资源死锁是什么?产生死锁的的四个条件如下:如何避免死锁?方案一:破坏不剥夺条件方案二:破坏请求与保持条件方案

场景模拟分析

场景一:狭路相逢

在星期天的早上十点半,你在公路上开着车,这是一条窄路,只能容纳一辆车。这时,迎面又驶来一辆车,你们都走到一半,谁也不想倒回去,于是各不相让。陷入无尽的等待。

场景二:冷战

你和她吵架了,谁也不理谁,甚至晚饭时间都各自煮饭。你在炒京酱肉丝,她在做葱烤鲫鱼。炒到一半你发现小葱被她全部拿走了,于是你默默等待她做好菜后再去拿。殊不知她也在等待你炒完菜后来拿酱油。

场景三:哲学家就餐

你和四个好朋友坐在圆形餐桌旁,你们只做两件事情:吃饭,或者思考。吃饭的时候,你们就停止思考。思考的时候,也停止吃饭。每个人面前有一碗兰州炒饭。并且每个人左右两边各有一根筷子。你们必须要拿到两根筷子才能开始吃饭。吃完后再放下筷子,让别人可以使用。吃了一会之后,每个人都拿起了自己左手边的筷子,导致每个人都只有一根筷子,并且等待别人吃完放下筷子给自己。可惜,没有人吃到饭,所以没有人会放下筷子。(著名的哲学家就餐问题)

场景四:竞争资源

你有两个线程 A 和 B ,各自在加锁的状态下运行。 A 持有一部分资源,并且等待 B 线程中的资源以完成自己的工作,而此时 B 线程也在等待 A 中的资源以完成自己的工作。由于他们都是锁定状态,所以他们必须完成了自己的工作后,自己持有的资源才能释放。于是线程无休止的等待,导致死锁。

死锁是什么?

上述四个场景都是程序员在工作或生活中会遇到的问题,人生就像是一个进程,时间是我们的主线程,期间做的每一件事都是开启的一个子线程。当多件事冲突时,并发问题就产生了。以上场景都指向同一类并发问题:死锁。

当两个以上的运算单元,双方都在等待对方停止运行,以获取系统资源,但是没有一方提前退出时,就称为死锁。

产生死锁的的四个条件如下:

1、互斥条件:一个资源每次只能被一个进程使用;

2、请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放;

3、不剥夺条件:进程已获得的资源,在没使用完之前,不能强行剥夺;

4、循环等待条件:多个进程之间形成一种互相循环等待资源的关系。

并发带来压力,有的人或有的程序,会因为承受不住压力而崩溃,情绪崩溃和程序崩溃没什么两样。当然,不论是做人还是写程序,面对问题时,正确的做法都应是采取策略,解除死锁。

如何避免死锁?

死锁一旦发生,便无法解除。我们能做的只能尽量避免死锁。要避免死锁,只需破坏产生死锁的四个条件之一即可。

方案一:破坏不剥夺条件

你想起书中所言:退一步海阔天空。但你也深知公平好过忍让。正值周赛时间,你摇下车窗,对对面的兄弟喊道:咱来比赛一场力扣周赛,谁输了谁倒出去让另一个人过吧!于是你们打开力扣,开始答题。半小时后,你凭借高超的代码水平 AC 了全部题目。对面司机对你拱手道:技不如人,甘拜下风。于是他倒了回去,让出了自己的一半路。最终你们都得以顺利通行。

破坏不剥夺条件:让对面的司机放弃了自己已有的资源。

方案二:破坏请求与保持条件

你在炒菜时发现没有小葱,于是你换位思考,想到她会不会也缺少自己用着的材料。虽然她还在和你冷战,但你劝解自己一个大老爷们不应该和女孩子置气,于是你主动把自己用着的所有材料拿给了她。她感受到你设身处地为她着想,大为感动,你们和好如初。之后她为你们两个人一起炒了京酱肉丝和葱烤鲫鱼。

破坏请求与保持条件:在自己需要的材料缺少时,主动放弃自己持有的资源,防止出现互相等待。

方案三:破坏循环等待条件

你和你的朋友们决定给筷子编上号:1~5。规定每个人拿筷子时必须先拿到自己两边的筷子中号码小的那一根,再去拿号码大的那一根。如果小的那一根没有拿到,不能先拿大的。当你们开始吃饭时,由于数字 5 不可能被一个人单独拿到。因为他旁边的另一根筷子编号必定比 5 小,所以不会再出现每个人都拿着一根的无限等待情形。

破坏循环等待条件:由于筷子指定了编号和获取规则,所以每个锁定状态都将按照顺序执行,于是便杜绝了环路等待条件。

方案四:破坏互斥条件

你在运行两个线程前,预先将线程 A 和 B 中的资源拷贝一份,让他们不需互相等待对方的资源,于是两个线程都得以顺利运行。

破坏互斥条件:由于每次使用时都拷贝一份,所以一个资源可以被多个进程使用。

以上就是java并发编程死锁定义及如何避免死锁的详细内容,更多关于java死锁及避免的资料请关注编程网其它相关文章!

--结束END--

本文标题: java并发编程死锁定义及如何避免死锁

本文链接: https://www.lsjlt.com/news/138532.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java并发编程死锁定义及如何避免死锁
    目录场景模拟分析场景一:狭路相逢场景二:冷战场景三:哲学家就餐场景四:竞争资源死锁是什么?产生死锁的的四个条件如下:如何避免死锁?方案一:破坏不剥夺条件方案二:破坏请求与保持条件方案...
    99+
    2022-11-13
  • java并发编程死锁定义及避免死锁案例分析
    这篇文章主要介绍“java并发编程死锁定义及避免死锁案例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java并发编程死锁定义及避免死锁案例分析”文章能帮助大家解决问题。场景模拟分析场景一:狭路...
    99+
    2023-06-29
  • Java多线程死锁如何避免及解决
    本篇内容介绍了“Java多线程死锁如何避免及解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!下面是一个多线程死锁的例子输出thread1&...
    99+
    2023-06-02
  • 如何在并发编程中避免死锁和饥饿问题?
    在并发编程中,死锁和饥饿问题是非常常见的。死锁指的是两个或多个线程互相等待对方释放资源,导致所有线程都无法继续执行的情况。饥饿问题则是指某个线程由于优先级低或资源不足而无法获得所需资源,一直处于等待状态。 为了避免死锁和饥饿问题,我们可以采...
    99+
    2023-07-23
    bash leetcode 并发
  • Java并发编程中死锁的实现
    这篇文章给大家介绍Java并发编程中死锁的实现,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、什么是死锁所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进二、死锁产生的...
    99+
    2023-06-15
  • 如何通过编程发现Java死锁
    今天就跟大家聊聊有关如何通过编程发现Java死锁,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。死锁是指,两个或多个动作一直在等待其他动作完成而使得所有动作都始终处在阻塞的状态。想要在...
    99+
    2023-06-17
  • Java并发编程之死锁相关知识整理
    目录一、什么是死锁二、死锁产生的条件三、死锁产生的演示四、死锁的预防五、死锁的避免一、什么是死锁 所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都...
    99+
    2022-11-12
  • Java 同步问题:如何避免 IDE 中的死锁?
    在 Java 开发中,同步问题是一个非常常见的问题。其中,死锁是最棘手的问题之一。在 IDE 中,由于代码的复杂性和多线程的并发性,死锁问题更加常见。本文将介绍 Java 中的同步问题,包括死锁问题,以及如何避免 IDE 中的死锁。 一、...
    99+
    2023-06-26
    同步 ide http
  • C#开发中如何处理并发编程和死锁问题
    C#开发中如何处理并发编程和死锁问题,需要具体代码示例摘要:并发编程是现代软件开发中的重要主题,但也带来了一些挑战,例如线程安全、竞态条件和死锁等问题。本文将重点讨论在C#开发中处理并发编程和死锁问题的一些方法,并给出具体的代码示例。引言:...
    99+
    2023-10-22
    并发编程 (Concurrency Programming) 死锁问题 (Deadlock problem) 处理方法
  • Java自然语言处理中的同步函数:如何避免死锁问题?
    随着人工智能的发展,自然语言处理(NLP)成为了一个备受关注的领域。在NLP中,同步函数是一个重要的概念,它被用于确保多个线程能够安全地访问共享资源。然而,在使用同步函数的过程中,死锁问题也可能会出现。本文将介绍Java中的同步函数以及如...
    99+
    2023-10-29
    自然语言处理 同步 函数
  • go语言中的缓存和并发处理:如何避免容器的竞争和死锁问题?
    Go语言是一门非常强大的编程语言,它特别擅长处理并发。在Go语言中,我们可以使用缓存来提高程序的运行效率,同时也可以通过并发处理来避免容器的竞争和死锁问题。本文将为你详细介绍Go语言中的缓存和并发处理,并提供一些演示代码。 一、什么是缓存?...
    99+
    2023-11-07
    缓存 并发 容器
  • 并发编程中如何使用Java中的锁?
    并发编程中如何使用Java中的锁? 在Java中,锁是一种用来控制多个线程访问共享资源的机制。锁可以保证在同一时刻只有一个线程可以访问共享资源,从而避免多个线程同时修改数据导致的数据不一致问题。Java中的锁可以分为两种类型:内置锁和显式锁...
    99+
    2023-08-28
    numy shell 并发
  • Java并发编程算法中,如何避免关键字的竞争条件?
    随着多核处理器的普及,Java并发编程已经成为了现代软件开发中不可或缺的一部分。然而,并发编程也带来了一系列新的问题,其中最常见的问题之一就是关键字的竞争条件。本文将深入探讨Java并发编程算法中如何避免关键字的竞争条件。 什么是关键字的...
    99+
    2023-10-22
    并发 关键字 编程算法
  • Linux日志记录:如何避免Java并发编程中的常见问题?
    Java并发编程是现代软件开发中不可避免的一部分。然而,Java的并发编程也可能会引起一些常见问题。例如,多线程竞争和死锁等问题可能会导致应用程序崩溃或出现其他问题。在本文中,我们将介绍如何使用Linux日志记录工具来避免这些常见问题。 ...
    99+
    2023-10-28
    并发 linux 日志
  • 重定向Go IDE:如何在并发编程中避免一些常见的错误?
    Go语言是一种非常流行的编程语言,它的并发编程模型使得它在网络编程、高并发场景下具有很大的优势。但是在并发编程中,常常会出现一些难以排查的错误。本文将介绍一些在并发编程中常见的错误,并提供一些避免这些错误的技巧。 竞态条件 竞态条件是...
    99+
    2023-09-23
    并发 ide 重定向
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作