返回顶部
首页 > 资讯 > 精选 >死锁检测的常用3种方法
  • 268
分享到

死锁检测的常用3种方法

javajvmandroid 2023-08-19 17:08:16 268人浏览 泡泡鱼
摘要

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

什么是死

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

死锁示例

接下来,我们先来演示一下 Java 中最简单的死锁,我们创建两个锁和两个线程,让线程 1 先拥有锁 o1,然后在 2s 后尝试获取锁 o2,同时我们启动线程 2,让它先拥有锁 o2,然后在 2s 之后尝试获取锁 o1,这时就会出现相互等待对方释放锁的情况,从而造成死锁的问题。
具体代码如下:

public class DeadLock {    public static void main(String[] args) {        Thread thread1 = new Thread(new DeadLockDemo(true));        Thread thread2 = new Thread(new DeadLockDemo(false));        thread1.start();        thread2.start();    }}class DeadLockDemo implements Runnable {    static Object o1 = new Object();    static Object o2 = new Object();    boolean flag;    public DeadLockDemo(boolean flag) {        this.flag = flag;    }    @Override    public void run() {        if (flag) {            synchronized (o1) {                System.out.println("线程1进入o1");                try {                    Thread.sleep(2000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                System.out.println("线程1等待进入o2");                synchronized (o2) {                    System.out.println(Thread.currentThread().getName() + "线程进入o2");                }            }        } else {            synchronized (o2) {                System.out.println("线程2进入o2");                try {                    Thread.sleep(3000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                System.out.println("线程2等待进入o1");                synchronized (o1) {                    System.out.println(Thread.currentThread().getName() + "线程进入o1");                }            }        }    }}

程序执行结果:
在这里插入图片描述
从上述结果可以看出,线程 1 和线程 2 都在等待对方释放锁,这样就造成了死锁问题。

死锁产生原因

通过以上示例,我们可以得出结论,要产生死锁需要满足以下 4 个条件:

互斥条件:指运算单元(进程、线程或协程)对所分配到的资源具有排它性,也就是说在一段时间内某个锁资源只能被一个运算单元所占用。
请求和保持条件:指运算单元已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它运算单元占有,此时请求运算单元阻塞,但又对自己已获得的其它资源保持不放。
不可剥夺条件:指运算单元已获得的资源,在未使用完之前,不能被剥夺。
环路等待条件:指在发生死锁时,必然存在运算单元和资源的环形链,即运算单元正在等待另一个运算单元占用的资源,而对方又在等待自己占用的资源,从而造成环路等待的情况。
只有以上 4 个条件同时满足,才会造成死锁问题。

死锁排查

如果程序出现死锁问题,可通过以下 3种方案中的任意一种进行分析和排查。
方案一:jstack
在使用 jstack 之前,我们需要先通过 jps -l得到运行程序的进程 ID,使用方法如下:
在这里插入图片描述
有了进程 ID(PID)之后,我们就可以使用“jstack -l PID”来发现死锁问题了,如下图所示:
在这里插入图片描述

方案二:jconsole
jconsole工具位于jdk的bin目录下,如图:
在这里插入图片描述
双击进入,选择要调试的程序,如下图所示:
在这里插入图片描述
会出现如下提示,选择不安全的链接
在这里插入图片描述
点击线程栏目,然后点下面死锁,就会检测出来了
在这里插入图片描述

方案三:jvisualvm
jvisualvm 也在 JDK 的 bin 目录中,同样是双击打开:
在这里插入图片描述
点击线程栏目,如果发生死锁,会自动提示如下:
在这里插入图片描述
点击线程dump:

在这里插入图片描述
以上是jdk8以上版本排查线程死锁的常用三种方案,还有一种是根据jmc(oracle Java Mission Control )排查,jmc是一个对 Java 程序进行管理、监控、概要分析和故障排查的工具套件,它也是在 JDK 的 bin 目录中。但是jdk1.8之后,jmc就已经不随着jdk一起发出去了,如果想要使用jmc对JVM进行监控,这时候需要手工下载jmc,然后在本地运行。oracle官网比较坑,现在只有jmc8.1版本下载,它需要jdk11,但作者暂时还没亲自试过,所以先不写了。

来源地址:https://blog.csdn.net/qq_38860250/article/details/128713910

--结束END--

本文标题: 死锁检测的常用3种方法

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

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

猜你喜欢
  • 死锁检测的常用3种方法
    什么是死锁 死锁(Dead Lock)是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程...
    99+
    2023-08-19
    java jvm android
  • MySQL InnoDB设置死锁检测的方法
    死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,可以认为如果一个资源被锁定,它总会在以后某个时间被释放。而死锁发生在当多个进程访问同一数据库时,其中每个进程拥有的锁都是其他进...
    99+
    2024-04-02
  • MySQL死锁使用详解及检测和避免方法
    目录前言锁的释放与阻塞死锁的发生和检测查看锁信息(日志)死锁的避免前言 上一篇博客我们知道的mysql事务的隔离机制和实现,以及锁的详细解析 链接: MySQL脏读幻读不可重复读及事务的隔离级别和MVCC、LBCC实现 ...
    99+
    2022-07-11
    MySQL死锁使用 MySQL死锁检测 MySQL死锁避免方法
  • Oracle 死锁的检测查询及处理
    死锁查询语句: -- 死锁查询语句 SELECT bs.username "Blocking User", bs.username "DB User", ...
    99+
    2024-04-02
  • 怎么在java中使用JConsole检测死锁
    这篇文章将为大家详细讲解有关怎么在java中使用JConsole检测死锁,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、We...
    99+
    2023-06-14
  • 死链检测工具Xenu的操作及使用方法
    Xenu是一款免费的死链检测工具,用于检测网站中的死链接。以下是Xenu的操作和使用方法:1. 下载和安装:在Xenu官方网站(ht...
    99+
    2023-09-20
    Xenu
  • 8种Python异常检测算法总结
    目录一、异常检测简介1.1 异常检测适用的场景1.2 异常检测存在的挑战二、异常检测方法2.1 基于聚类的方法2.2 基于统计的方法2.3 基于深度的方法2.4 基于分类模型2.5 ...
    99+
    2023-02-06
    Python异常检测算法 Python异常检测
  • java定位死锁的三种方法(jstack、Arthas和Jvisualvm)
    目录死锁 死锁发生的原因 死锁发生的条件 1:通过jstack定位死锁信息 1.2:查看死锁线程的pid2:通过Arthas工具定位死锁 3. 通过 Jvisualvm 定位死锁 死...
    99+
    2024-04-02
  • MySQL的死锁机制以及避免死锁的方法
    本篇内容主要讲解“MySQL的死锁机制以及避免死锁的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL的死锁机制以及避免死锁的方法”吧! ...
    99+
    2024-04-02
  • 聊聊几种检测Node.js安装的方法
    Node.js是一个基于Chrome V8引擎的 JavaScript 运行环境,使JavaScript可以在服务器端运行。它提供了一种轻量级的、高效的、开放性的平台,可以将 JavaScript 代码运行在不同的操作系统(如Windows...
    99+
    2023-05-14
  • 解决MySQL死锁的方法
    下面一起来了解下解决MySQL死锁的方法,相信大家看完肯定会受益匪浅,文字在精不在多,希望解决MySQL死锁的方法这篇短内容是你想要的。 一、查看MySQL死锁MySQL数据库会自己解决死锁,ki...
    99+
    2024-04-02
  • mysql死锁的解决方法
    mysql死锁的解决方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!MySQL有两种死锁处理方式:● 等待,直到超时(i...
    99+
    2024-04-02
  • SpringBoot 常用读取配置文件的 3 种方法!
    我们在SpringBoot框架进行项目开发中该如何优雅的读取配置呢?或者说对于一些List或者Map应该如何配置呢? 本篇主要解决如下几个问题: Spring Boot有哪些常用的读取配置文件方式? 1)使用 @Value 读取配置文件 2...
    99+
    2023-08-17
    java 数据库 mysql 面试 服务器
  • 数据库死锁:预防、检测和修复的终极指南
    使用死锁检测和超时机制:数据库管理系统(DBMS)可以配置为检测死锁并自动回滚事务。设置适当的超时时间,以防止死锁长时间存在。 避免嵌套事务:嵌套事务会导致潜在的死锁场景。尽量使用单个事务来执行操作。 保持事务简短:较短的事务不太可能导...
    99+
    2024-03-10
    预防死锁
  • JavaScript中检测数据类型的四种方法
    目录1. typeof2. instanceof3. constructor(构造函数)4. Object.prototype.toString.call()前言:在介绍检测数据类型...
    99+
    2024-04-02
  • db2死锁监视器的使用方法
    这篇文章主要介绍“db2死锁监视器的使用方法”,在日常操作中,相信很多人在db2死锁监视器的使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”db2死锁监视器的使用方法”...
    99+
    2024-04-02
  • vue如何关闭eslint检测(多种方法)
    目录一、问题描述二、问题解决一、问题描述 我们在开发vue项目的时候,创建的时候可能会不小心选择了eslint,这个检测规则对于新手来说,简直就是噩梦,会让你崩溃。所以如果不想让es...
    99+
    2024-04-02
  • 详解通过SQL进行分布式死锁的检测与消除
    目录概述分布式死锁和单节点死锁的比较单节点死锁分布式死锁分布式死锁的检测与消除收集各节点的锁信息构建等待关系等待关系判环消除死锁总结概述 分布式数仓应用场景中,我们经常遇到数据库系统...
    99+
    2024-04-02
  • Linux下常用的3种网络测速工具介绍
    本篇内容介绍了“Linux下常用的3种网络测速工具介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!fastfast 是 Netflix 提...
    99+
    2023-06-01
  • python 遍历数组的3种方法及常用的代码
      直接使用数组的元素进行遍历,但这种遍历方法效率较低,不推荐使用。可以使用 python中的 num或者 int数组。 2、使用 python中的my_num,该方法通过数组的末尾进行遍历,效率最高,可以直接使用。 5、在 Python...
    99+
    2023-09-21
    python 算法 数据结构
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作