返回顶部
首页 > 资讯 > 精选 >java中怎么避免程序死锁
  • 772
分享到

java中怎么避免程序死锁

2023-06-02 16:06:59 772人浏览 薄情痞子
摘要

本篇文章为大家展示了java中怎么避免程序死锁,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。  死锁发生的条件  互斥,共享资源只能被一个线程占用  占有且等待,线程 t1 已经取得共享资源 s1,

本篇文章为大家展示了java中怎么避免程序死,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

  死锁发生的条件

  互斥,共享资源只能被一个线程占用

  占有且等待,线程 t1 已经取得共享资源 s1,尝试获取共享资源 s2 的时候,不释放共享资源 s1

  不可抢占,其他线程不能强行抢占线程 t1 占有的资源 s1

  循环等待,线程 t1 等待线程 t2 占有的资源,线程 t2 等待线程 t1 占有的资源

  避免死锁的方法

  对于以上 4 个条件,只要破坏其中一个条件,就可以避免死锁的发生。

  对于第一个条件 "互斥" 是不能破坏的,因为加锁就是为了保证互斥。

  其他三个条件,我们可以尝试

  一次性申请所有的资源,破坏 "占有且等待" 条件

  占有部分资源的线程进一步申请其他资源时,如果申请不到,主动释放它占有的资源,破坏 "不可抢占" 条件

  按序申请资源,破坏 "循环等待" 条件

  使用管理类一次性申请所有的资源,破坏 "占有且等待" 条件示例

  package constxiong.concurrency.a023;

  import java.util.HashSet;

  import java.util.Set;

  

  public class TestBreakLockAndWait {

  //单例的资源管理类

  private final static Manger manager = new Manger();

  //资源1

  private static Object res1 = new Object();

  //资源2

  private static Object res2 = new Object();

  public static void main(String[] args) {

  new Thread(() -> {

  boolean applySuccess = false;

  while (!applySuccess) {

  //向管理类,申请res1和res2,申请失败,重试

  applySuccess = manager.applyResources(res1, res2);

  if (applySuccess) {

  try {

  System.out.println("线程:" + Thread.currentThread().getName() + " 申请 res1、res2 资源成功");

  synchronized (res1) {

  System.out.println("线程:" + Thread.currentThread().getName() + " 获取到 res1 资源的锁");

  //休眠 1秒

  try {

  Thread.sleep(1000);

  } catch (Exception e) {

  e.printStackTrace();

  }

  synchronized (res2) {

  System.out.println("线程:" + Thread.currentThread().getName() + " 获取到 res2 资源的锁");

  }

  }

  } finally {

  manager.returnResources(res1, res2);//归还资源

  }

  } else {

  System.out.println("线程:" + Thread.currentThread().getName() + " 申请 res1、res2 资源失败");

  //申请失败休眠 200 毫秒后重试

  try {

  Thread.sleep(200);

  } catch (Exception e) {

  e.printStackTrace();

  }

  }

  }

  }).start();

  new Thread(() -> {

  boolean applySuccess = false;

  while (!applySuccess) {

  //向管理类,申请res1和res2,申请失败,重试

  applySuccess = manager.applyResources(res1, res2);

  if (applySuccess) {

  try {无锡妇科医院哪家好 Http://www.xasgfk.cn/

  System.out.println("线程:" + Thread.currentThread().getName() + " 申请 res1、res2 资源成功");

  synchronized (res2) {

  System.out.println("线程:" + Thread.currentThread().getName() + " 获取到 res1 资源的锁");

  //休眠 1秒

  try {

  Thread.sleep(1000);

  } catch (Exception e) {

  e.printStackTrace();

  }

  synchronized (res1) {

  System.out.println("线程:" + Thread.currentThread().getName() + " 获取到 res2 资源的锁");

  }

  }

  } finally {

  manager.returnResources(res1, res2);//归还资源

  }

  } else {

  System.out.println("线程:" + Thread.currentThread().getName() + " 申请 res1、res2 资源失败");

  //申请失败休眠 200 毫秒后重试

  try {

  Thread.sleep(200);

  } catch (Exception e) {

  e.printStackTrace();

  }

  }

  }

  }).start();

  }

  }

  

  class Manger {

  //资源存放集合

  private Set

上述内容就是java中怎么避免程序死锁,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网精选频道。

--结束END--

本文标题: java中怎么避免程序死锁

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

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

猜你喜欢
  • java中怎么避免程序死锁
    本篇文章为大家展示了java中怎么避免程序死锁,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。  死锁发生的条件  互斥,共享资源只能被一个线程占用  占有且等待,线程 t1 已经取得共享资源 s1,...
    99+
    2023-06-02
  • 怎么避免java死锁
    这篇文章主要介绍“怎么避免java死锁”,在日常操作中,相信很多人在怎么避免java死锁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么避免java死锁”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!来到...
    99+
    2023-06-16
  • 怎么在Java中避免死锁
    这篇文章给大家介绍怎么在Java中避免死锁,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许程序员以优雅的思维...
    99+
    2023-06-14
  • java并发编程死锁定义及如何避免死锁
    目录场景模拟分析场景一:狭路相逢场景二:冷战场景三:哲学家就餐场景四:竞争资源死锁是什么?产生死锁的的四个条件如下:如何避免死锁?方案一:破坏不剥夺条件方案二:破坏请求与保持条件方案...
    99+
    2024-04-02
  • golang中什么是死锁?怎么避免?
    一、什么是死锁?在并发编程中,当两个或多个进程(线程)相互等待对方的资源释放时,就会产生死锁(Deadlock)。简单来说,就是每个进程都占用了一部分资源,同时需要等待对方释放资源,以完成自己的任务,但是对方也一样,这时候就会造成死循环式的...
    99+
    2023-05-14
  • java并发编程死锁定义及避免死锁案例分析
    这篇文章主要介绍“java并发编程死锁定义及避免死锁案例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java并发编程死锁定义及避免死锁案例分析”文章能帮助大家解决问题。场景模拟分析场景一:狭路...
    99+
    2023-06-29
  • Golang怎么实现死锁?怎么避免?
    Golang 是一门高效、强类型、静态类型的编程语言,由 Google 开发,目的是为了解决一些类似于死锁等问题。虽然 Golang 实现死锁十分困难,但是在这篇文章中,我们将要探讨如何使用 Golang 实现死锁。什么是死锁?死锁指的是多...
    99+
    2023-05-14
  • MySQL死锁怎么检测和避免
    这篇文章主要讲解了“MySQL死锁怎么检测和避免”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL死锁怎么检测和避免”吧! ...
    99+
    2024-04-02
  • mysql怎么避免死锁的产生
    这篇文章主要讲解了“mysql怎么避免死锁的产生”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql怎么避免死锁的产生”吧!说明等待事务超时,主动回滚。进行死锁检查,主动回滚某一事务,让...
    99+
    2023-06-20
  • Java多线程死锁如何避免及解决
    本篇内容介绍了“Java多线程死锁如何避免及解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!下面是一个多线程死锁的例子输出thread1&...
    99+
    2023-06-02
  • Java 同步问题:如何避免 IDE 中的死锁?
    在 Java 开发中,同步问题是一个非常常见的问题。其中,死锁是最棘手的问题之一。在 IDE 中,由于代码的复杂性和多线程的并发性,死锁问题更加常见。本文将介绍 Java 中的同步问题,包括死锁问题,以及如何避免 IDE 中的死锁。 一、...
    99+
    2023-06-26
    同步 ide http
  • Java中避免出现死锁的方法有哪些
    今天就跟大家聊聊有关Java中避免出现死锁的方法有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。避免死锁的技术:加锁顺序加锁时限死锁检测加锁顺序当多个线程需要相同的一些锁,但是按...
    99+
    2023-05-31
    java 死锁 ava
  • 如何在并发编程中避免死锁和饥饿问题?
    在并发编程中,死锁和饥饿问题是非常常见的。死锁指的是两个或多个线程互相等待对方释放资源,导致所有线程都无法继续执行的情况。饥饿问题则是指某个线程由于优先级低或资源不足而无法获得所需资源,一直处于等待状态。 为了避免死锁和饥饿问题,我们可以采...
    99+
    2023-07-23
    bash leetcode 并发
  • Go并发编程中如何避免死锁和竞态条件
    在 go 并发编程中,为了避免死锁和竞态条件,有以下准则:避免死锁:识别共享资源,指派明确所有者,并使用死锁检测工具。避免竞态条件:使用互斥锁、读写锁或原子操作来确保共享数据的并发访问安...
    99+
    2024-05-13
    并发编程 竞态条件 死锁 golang 并发访问
  • mysql怎么避免锁表
    mysql避免锁表的方法:保持事务的轻量,可减少对锁资源占用。尽量避免并发的执行涉及到修改数据的语句。避免使用子查询,尽量使用主键。编写应用程序过程中,让进程持有锁的时间缩短。...
    99+
    2024-04-02
  • java多线程学习之死锁的模拟和避免(实例讲解)
    1.死锁死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。Java 死锁产生的四个必要条件:互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用不可抢...
    99+
    2023-05-31
    java 多线程 避免
  • Java中怎么避免OOM
    Java中怎么避免OOM,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一.了解 强引用、软引用、弱引用、虚引用的概念在Java中,虽然不需要程序员手动去管理对象...
    99+
    2023-06-17
  • java中避免集合死链调用详情
    目录1. 前言2. 场景3. 环境3.1 开发环境准备3.2 数据准备3.2.1 Mysql数据库表及数据3.2.2 redis库数据4. 解决方式5.完整代码5.1 Model5....
    99+
    2024-04-02
  • .NET监视程序中死锁怎么处理
    这篇文章将为大家详细讲解有关.NET监视程序中死锁怎么处理,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。监视程序主要是用来监控是否出现死锁等情况,但是这种.NET监视程序一般只能在测试中使用,如果大范围使...
    99+
    2023-06-17
  • Java中怎么排查死锁
    这期内容当中小编将会给大家带来有关Java中怎么排查死锁,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。首先,我们构造一个死锁场景。如何构造一个死锁呢很简单,只要让线程1占有对象a的锁后,再去请求对象b的锁...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作