java死锁

一、什么是死锁

锁是个非常有用的工具,运用场景非常多,因为它使用起来非常简单,而且易于理解。但同时它也会带来一些困扰,那就是可能会引起死锁,一旦产生死锁,就会造成系统功能不可用。
在这里插入图片描述
比如我们现在有ThreadA和ThreadB两个线程,ThreadA当中有两个锁,ThreadB当中也有两个锁。ThreadA当中的LOCK1锁住了资源A,ThreadB当中的LOCK1锁住了资源B。但是ThreadA当中的LOCK2想要被ThreadB的LOCK1锁锁住的资源B,而ThreadB当中的LOCK2想要ThreadA当中被LOCK1锁住的资源A,而且线程的双发只有等到LCOK2锁住了自己想要的资源才会释放被LCOK1锁住的资源,所以此时就会出现死锁。

总结:死锁就是两个或两个以上的线程去争抢同一个共享资源导致互相等待的一个现象。在没有外部干预的情况下,线程无法继续向下去执行。

二、展示什么是死锁

public class ConcurrencyTest {

    public static Object A = new Object();
    public static Object B = new Object();

    public static void main(String[] args) {
         new Thread(()->{
             synchronized (A){
                 System.out.println(Thread.currentThread().getName()+"获取了资源A的锁");
                 try {
                     Thread.sleep(1000);
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
                 synchronized (B){
                     System.out.println(Thread.currentThread().getName()+"获取了资源B的锁");
                 }
             }
         }).start();

        new Thread(()->{
            synchronized (B){
                System.out.println(Thread.currentThread().getName()+"获取了资源A的锁");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (A){
                    System.out.println(Thread.currentThread().getName()+"获取了资源B的锁");
                }
            }
        }).start();
    }
}

在这里插入图片描述

查看死锁的更多信息

①:根据jps查询所有java线程信息

在这里插入图片描述

②:使用jstack查看线程信息

在这里插入图片描述

③:观察信息,我们发现两个线程都是BLOCKED的状态

在这里插入图片描述
在最后边提示我们出现了死锁
在这里插入图片描述

三、产生死锁的必要条件

1.互斥使用

共享资源x和y只能被一个线程占用

2.请求和保持条件

线程t1在已经占据共享资源x的情况下,并且在等待共享资源y的时候不释放共享资源x。 这就意味着即使进程无法继续执行,它仍然保持对已获得资源的控制。

3.不可抢占条件

其他线程不能强行去抢占线程t1已经占有的资源。

4.循环等待

线程T1等待线程T2占有的资源,线程T2等待线程T1占有的资源,就是循环等待 ---- 两个线程相互等待。

四、如何避免产生死锁

线程在产生死锁以后,只能通过外部的干预来解决只能重启获取kill线程等。所以我们在写代码的时候就应该刻意避免产生线程的死锁,也就是避免同时满足四个必要条件。互斥条件是锁本身的特征无法被破坏,那么其他三个条件都可以被破坏。

  • 对于请求保持条件,我们可以在第一次执行的时候,一次性申请所有的共享资源。
  • 对于不可抢占条件,占用部分资源的线程,在进一步去申请其他资源的时候,如果申请不到啊,就主动释放它占有的资源。
  • 对于循环等待条件,可以按照顺序来去申请锁资源,相当于给资源一个编号,按照编号顺序去申请,就可以避免循环等待的问题。

五、总结

出现死锁以后,可以通过jstack命令导出线程的dump日志,然后从dump日志里面定位到具体死锁的程序代码,通过修改程序代码去破坏这四个条件当中的任意一个就可以解决死锁问题。当然因为互斥条件,因为是锁本身的特性,所以不能被破坏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/555950.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络防火墙技术知多少?了解如何保护您的网络安全

在当前以网络为核心的世界中,网络安全成为了至关重要的议题。网络防火墙是一种常见的保护网络安全的技术,用于监控和控制网络流量,阻止未经授权的访问和恶意活动。今天德迅云安全就带您了解下防火墙的一些相关功能和类型。 防火墙的五个功能…

使用clickhouse-backup迁移数据

作者:俊达 1 说明 上一篇文章中,我们介绍了clickhouse-backup工具。除了备份恢复,我们也可以使用该工具来迁移数据。 这篇文章中,我们提供一个使用clickhouse-backup做集群迁移的方案。 2 前置条件 1、源端和目标端网络联通&a…

SRIO系列-仿真测试

一、前言 前两篇已经讲述了SRIO协议的概况,以及xilinx SRIO IP核的使用方式,已经在搭建工程的过程中时钟和复位的注意事项。 二、设计框图 整个框图也是按照之前的工程进行搭建,首先时SRIO_Channel,由SRIO IP核和时钟、复位模块…

使用yolov5训练自己的目标检测模型

使用yolov5训练自己的目标检测模型 使用yolov5训练自己的目标检测模型1. 项目的克隆2. 项目代码结构3. 环境的安装和依赖的安装4. 数据集和预训练权重的准备4.1利用labelimg标注数据和数据的准备4.1.1 **labelimg介绍:**4.1. 2 labelimg的安装 4.2 使用labelimg4.2.1 数据准备4…

[疑难杂症2024-003]如何判断一张没有头信息的dcm图像,是否是压缩图像?

本文由Markdown语法编辑器编辑完成. 1. 前言: DCM格式,是医学图像领域里面的通用格式.DCM图像一般分为两大部分,一部分是TAG信息,一部分是像素. 而TAG信息,一般又会分为两部分,如下图所示, 是…

编写Spark独立应用程序

执行本文之前,先搭建好spark的开发环境,我目前只搭建了standalone模式,参考链接 : Spark Standalone模式部署-CSDN博客 1. 安装sbt 1)下载sbt 网址:https://www.scala-sbt.org/download.html &#xff0c…

Linux 系统下的进程间通信 IPC 入门 「下」

以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/IvPHnEsC6ZdIHaFL8Deazg 共享内存 我们在进程间传输比较大的数据块时,通常选用共享内存的方式。共享内存大小也是有限制的&#xff0…

Python进阶编程 --- 3.闭包、装饰器、设计模式、多线程、网络编程、正则表达式、递归

文章目录 第三章:3.1 闭包3.2 装饰器语法糖写法 3.3 设计模式3.3.1 单例模式3.3.2 工厂模式 3.4 多线程3.4.1 进程、线程和并行执行3.4.2 多线程编程 3.5 网络编程3.5.1 Socket3.5.2 服务端开发3.5.3 客户端开发 3.6 正则表达式3.6.1 基础匹配3.6.2 元字符匹配单字符…

风力发电自动化控制系统中的智能化技术应用研究

风力发电自动化控制系统中的智能化技术应用研究 随碳中和目标的提出和执行,风能发电作为新能源行业的核心部分,步入了它的黄金发展期。由于风能资源具有间歇性、随机性等特点,这给风电的高效利用带来了巨大挑战。为了增强风力发电系统的工作效…

Py深度学习基础|Numpy基础总结

注:本文来自菜鸟教程学习总结 一、数组属性 NumPy 的数组中比较重要 ndarray 对象属性有: 注意:使用reshape后,数组的结构(即元素的排列顺序和内在连接)没有改变,但因为返回的是一个视图&#…

PTA L1-009 N个数求和 【C++】【辗转相除法】【Python】

C: 辗转相除法: 每次算最小公倍数和最大公约数都是用的常规思路,本身是不会有错的,但是当数据很大时,就会出现错误,时间复杂度过高 辗转相除法,又称欧几里德算法(Euclidean Algori…

接口压力测试 jmeter--增强篇(二)

前期准备 1. JMeter的插件的安装 下载Jmeter Plugins Manager对插件进行管理 (1)下载地址:https://jmeter-plugins.org/install/Install/ (2)下载后,将jar包放到jmeter包目录下/lib/ext目录下 &#xff0…

【YOLOv8改进[检测头Head]】YOLOv8的“新头”之动态头(DynamicHead)

目录 一 DynamicHead 二 YOLOv8的“新头”之动态头 1 总体修改 2 配置文件 3 训练 其他 一 DynamicHead 官方论文地址:https://arxiv.org/pdf/2106.08322.pdf 官方代码地址:GitCode - 开发者的代码家园 在计算机视觉应用中,目标检测…

启动appium服务的2种方法(python脚本cmd窗口)

1.通过cmd窗口命令来启动 2.通过python代码启动 2.1启动单个appium服务 2.2启动多个appium服务 3.端口说明 一.端口号设置Appium服务器端口:4723 bp端口:4724 Appium服务器端口:4725 bp端口:4726可以看到appium服务器端口和bp端…

SpringBoot(一)【入门】

前言 1、SpringBoot 快速入门 1.1、SpringBoot 简介 SpringBoot 是用来简化 Spring 应用的初始搭建以及开发过程 首先我们回顾一下 SpringMVC 项目的开发过程: 导入依赖(javax.servlet-api 和 spring-webmvc)Servlet 容器配置类&#xff…

VirtualBox虚拟机使用win11系统,忘记密码如何重置密码

1. 点击重启同时按住Shift(按住不放) 2. 直到出现下面的界面,释放Shift,并进入疑难解答 3. 进入高级选项 4. 进入命令提示符 5. 发现当前是在X盘? 6. 进入C:\Windows\System32 c: cd Windows\System32 7. 备份osk.exe…

SpringCloud系列(5)--SpringCloud微服务工程公共部分提取

前言:在上一章节中我们创建了两个个SpringCloud工程,但在两个工程中分别存在着一些重复的部分,例如重复的实体类(如图所示),这样会造成系统的冗余,所以我们需要把公共的类提取到一个工程里&…

预约小程序新选择:强大后端管理功能一览

拥有一个功能齐全、操作便捷的小程序对于商家来说至关重要。为了满足广大商家的需求,乔拓云平台提供了丰富的模板资源,帮助用户快速搭建预约型小程序,并配备了强大的后端管理功能,让商家能够轻松管理预约订单,提升运营…

Centos7 ElasticSearch集群搭建

1. 服务器环境配置 1.1 配置hosts文件 3台服务器都要执行 vim /etc/hosts; # 将以下内容写入3台服务器hosts文件 192.168.226.148 es001 192.168.226.149 es002 192.168.226.150 es003 1.2 关闭防火墙 3台服务器都要执行 systemctl stop firewalld; systemctl disable…

【opencv】dnn示例-speech_recognition.cpp 使用DNN模块结合音频信号处理技术实现的英文语音识别...

模型下载地址: https://drive.google.com/drive/folders/1wLtxyao4ItAg8tt4Sb63zt6qXzhcQoR6 终端输出:(audio6.mp3 、audio10.mp3) [ERROR:00.002] global cap_ffmpeg_impl.hpp:1112 open VIDEOIO/FFMPEG: unsupported parameter…