什么是死锁?代码演示,死锁如何排查和解决

devtools/2024/9/25 8:29:26/

死锁的概念

死锁是指在多线程或多进程中,两个或两个以上的线程或进程在执行过程中,因抢夺资源而造成的一种相互等待的现象。简单来说,就是两个或两个以上的线程或进程都在等待对方释放资源,从而导致所有线程或进程都无法继续执行的情况。

死锁的示例

有两个线程A,B,线程A占用了锁A,线程B占用了锁B,在这种情况下线程A又想获取锁B,线程B也想获取锁A,自己不释放锁,却又都在等待对象释放锁资源,相互僵持,就会造成死锁

死锁代码演示

java">// 模拟死锁
public class Demo0 {public static void main(String[] args) {String lock1 = "lock1";String lock2 = "lock2";new Thread(new DeadLock(lock1,lock2),"线程1").start();new Thread(new DeadLock(lock2,lock1),"线程2").start();}}class DeadLock implements Runnable{private String lock1;private String lock2;public DeadLock(String lock1,String lock2) {this.lock1 = lock1;this.lock2 = lock2;}@Overridepublic void run() {synchronized (lock1) {System.out.println(Thread.currentThread().getName()+"获取"+lock1);try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}synchronized (lock2) {System.out.println(Thread.currentThread().getName()+"获取"+lock2);}}}
}

死锁的必要条件(四点)

  1. 互斥:一个资源每次只能被一个进程或线程使用
  2. 请求与保持:一个进程或线程请求资源而阻塞时,对已经获得的资源保持不放。
  3. 不可抢占:进程或线程以获得的资源,在未使用完之前,不能强行剥夺。
  4. 循环等待:若干进程或线程之间形成一种头尾相接的循环等待资源关系。

死锁的排查方法

  1. 查看日志
  2. 打印堆栈信息
  3. 使用jdk提供的可视化工具 jconsole

演示打印堆栈信息

  •   第一步:使用 jps -l 查看所有正在运行的线程信息,获取线程id
  •   第二步:使用 jstack 线程id 定位线程死锁的详细信息

演示可视化工具 jconsole

首先找到该工具 ,其位于jdk的bin目录下

死锁的解决办法 

预防:死锁的产生是有四个必要条件的,那么只要破环其中一个条件,就不会出现死锁。但是必要条件中互斥条件又是锁的特性。破环其他三个条件之一就行。

避免:避免死锁与预防死锁的区别在于:预防死锁是设法至少破坏产生死锁的必要条件之一,严格地防止死锁的出现。而避免死锁,则是在进程请求分配资源时,采用某种算法(银行家算法)来预防可能发生的死锁,从而拒绝可能引起死锁的某个资源请求。


http://www.ppmy.cn/devtools/28919.html

相关文章

Java image-processing 包依赖错误

错误的信息为: [ERROR] Failed to execute goal on project image-processing: Could not resolve dependencies for project com.ossez:image-processing:jar:0.0.2-SNAPSHOT: Failed to collect dependencies at org.openimaj:core-image:jar:1.3.10 -> org.op…

织梦云端:网络信号原理的艺术解码

hello !大家好呀! 欢迎大家来到我的Linux高性能服务器编程系列之《织梦云端:网络信号原理的艺术解码》,在这篇文章中,你将会学习到网络信号原理以及应用,并且我会给出源码进行剖析,以及手绘UML图…

前端计算机网络之网络模型

什么是网络模型 对于前端开发者而言,理解网络模型的概念是非常重要的。网络模型是描述数据如何在网络中传输和处理的框架和规则,它有助于前端开发者更好地理解和优化应用程序与服务器之间的通信过程。 常用的两类模型 前端开发者需要了解的网络模型主…

python 关键字(import)

4、import 在Python编程中,import 是一个至关重要的关键字,它用于导入其他Python模块或库中的代码,以便在当前程序中使用。无论是Python新手还是经验丰富的开发者,都需要对import有深入的理解。 基础知识:import 的基…

串的介绍与类型定义

串的定义 相关术语 应用 串类型定义 顺序存储实现 为了方便操作,数组下标从1开始存储 链式存储实现

AI视频教程下载:构建一个ChatGPT股票配对交易机器人

ChatGPT及其后续版本GPT-4已经开始改变世界。人们对新机会感到兴奋,同时对我们社会可能受到的影响感到恐惧。这门课程结合了两个主题:AI和财务(算法交易)。 你将会学到的: 使用ChatGPT构建一个Python配对交易机器人 …

龙芯中标麒麟安装pyqt和运行项目主程序

1、龙芯中标麒麟系统自带python3.4,无需安装,可以兼容高版本python开发环境的项目代码; 2、利用pip install 安装项目代码所需要的python包(qtpy,xlrd…); 3、如果pip更新之后用pip install,报…

C++进阶——STL

STL基本概念: STL——Standard Template Library (标准模板库) 提升开发效率并保证代码质量,通过泛型编程,使得这些数据结构和算法适用于多种数据类型 STL的六大组件:容器、算法、迭代器、仿函数、适…