JAVA基础多线程-模拟线程死锁以及预防和避免死锁

手把手简单模拟并解决死锁 最后, 需要注意⚠️的是, 以上只是了解认识以及临时解决死锁问题的方案, 毕竟, 在并发高的场景下以上类似sql极易产生死锁, 即使手动解了, 也可能很快又被锁上了, 所以, 找到sql所在的代码, 优化代码才是解决问题的根本.按顺序执行事务一中的update语句和事务二中的update语句, 在执行事务一中的select语句和事务二中的select语句, 执行后如图, 死锁产生了。执行完后, 再次查询上面的第一条select语句后, 就发现死锁没有了。拿到进程pid后, 就能将其杀死了。 阅读详情

引言

        线程死锁描述的是这样一种情况:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。

一,模拟死锁

示例代码:

public class LockT1 {
    Object o = new Object();
    Object k = new Object();

    public static void main(String[] args) {
        LockT1 l = new LockT1();
        Thread th = new Thread(l::m);
        th.start();
        Thread th1 = new Thread(l::n);
        th1.start();


    }

    void m() {
        String p = Thread.currentThread().getName();
        System.out.println("启动等待" + p);
        synchronized (o) {
            try {
                Thread.sleep(200);
            } catch (Exception e) {
                e.printStackTrace();
            }
            synchronized (k) {

            }
            System.out.println("线程结束" + p);
        }
    }

    void n() {
        String p = Thread.currentThread().getName();
        System.out.println("启动等待" + p);
        synchronized (k) {
            try {
                Thread.sleep(200);
            } catch (Exception e) {
                e.printStackTrace();
            }
            synchronized (o) {

            }
        }
        System.out.println("线程结束" + p);
    }
}

输出结果:

 二,预防和避免死锁

2.1,如何预防死锁? 

        破坏死锁的产生的必要条件即可:

  1. 破坏请求与保持条件 :一次性申请所有的资源。
  2. 破坏不剥夺条件 :占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。
  3. 破坏循环等待条件 :靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。破坏循环等待条件。

2.2,如何避免死锁?

        避免死锁就是在资源分配时,借助于算法(比如银行家算法)对资源分配进行计算评估,使其进入安全状态。

安全状态指的是系统能够按照某种进行推进顺序(P1、P2、P3.....Pn)来为每个进程分配所需资源,直到满足每个进程对资源的最大需求,使每个进程都可顺利完成。称<P1、P2、P3.....Pn>序列为安全序列。

多线程-死锁定位以及如何避免死锁(银行家算法) 什么是死锁: 死锁是指两个或两个以上线程在执行过程中,由于竞争资源而造成的阻塞问题,若无外力作用下,他们将无法推荐下去,此时系统处于死锁状态。 死锁的危害: 导致程序得不到正确的运行结果:因为程序产生死锁,发生阻塞,不会继续向下执行。 浪费资源:产生死锁,最少有两个线程会发生阻塞。 产生新的死锁:产生死锁的线程会一直占有锁资源,会导致其它尝试获取该锁的线程也发生死锁,产生多米诺效应。 死锁产生... 阅读详情

相关推荐

软件设计师之死锁问题深度剖析:原因、预防与处理

在软件开发中,操作系统的稳定运行至关重要,而死锁问题是影响系统稳定性的关键因素之一。今天,我们就一起深入学习死锁相关知识,希望能和大家共同进步,提升在操作系统领域的认知水平。

wj_rdk的博客 1730

JAVA-死锁的模拟和解决办法

有 5 个哲学家,他们面前都有一双筷子,即左手有一根筷子,右手有一根筷子。哲学家左手要拿到一根筷子,右手也要拿到一根筷子,在这种情况下哲学家才能吃饭。死锁:如果每个哲学家都同时拿起左手的筷子,那么就形成了环形依赖,在这种特殊的情况下,,自然也就没有人会放下手中的筷子。这就陷入了死锁,形成了一个相互等待的情况。

m0_66328098的博客 304

java如何实现一个死锁 ?

死锁(Deadlock)是指在并发系统中,两个或多个线程(或进程)因争夺资源而互相等待,导致它们都无法继续执行的一种状态。

猿小白的博客 447

java模拟死锁

死锁:指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。例如:假如有一个线程,在它执行的过程中。他首先需要锁定A,然后再需要锁定B,再锁定A的过程中还需要锁定B,另一个线程需要先锁定B,然后再需要锁定A,再锁定B的过程中还需要锁定A,整个线程才能完...

哔哔herry的博客 722

inferCNV包安装问题及解决办法

InferCNV是一个由broad研究所开发的,利用单细胞转录组数据分析肿瘤细胞拷贝数变异(CNV)的工具。基本思路是在整个基因组范围内,通过计算肿瘤细胞关于参考的“正常”细胞的相对表达,利用滑窗思想对邻近的基因相对表达,计算拷贝数。 先贴一个官方安装说明: 官方infercnv安装说明 安装infercnv包: if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager") BiocManager:

m0_51042606的博客 6803

Aurix TC3XX Cache memory分析

Aurix Cache memory 分析

qwe0405080615的博客 4348

java多线程模拟死锁

synchronized的嵌套。

qq_65142821的博客 266

CAT24C16 EEPROM的I²C页写与页读底层实现

I²C是一种广泛应用于嵌入式系统的双线同步串行通信协议,其核心在于严格的时序控制、地址寻址机制与主从应答逻辑。理解I²C总线物理层(上拉电阻、SCL/SDA电气特性)、协议层(START/STOP、ACK/NACK、7位地址格式)及外设寄存器操作(如SR1状态标志、CCR时钟分频),是实现可靠通信的基础。在实际工程中,EEPROM类器件(如CAT24C16)因其非易失性、页缓冲区结构和写保护(WP)功能,成为数据持久化关键载体;其16字节页写约束、内部写周期(5–10ms)与地址指针自动递增等特性,直接决定

weixin_42591413的博客 389

【多线程】⭐️(java)本地模拟死锁的产生和排查方式

JAVA 中如何模拟死锁,以及如何排查死锁的位置

产品经理克星(狗头) 1003

uniapp(安卓 | 苹果) - 最新详细实现App打包发布教程,uni-app苹果IOS软件应用上架App Store软件商店,uni-app打包发布安卓Android软件到各大应用商店(详细教程

uni-app,安卓android,苹果ios,uniapp App软件,Uniapp上架发布应用,打包构建,apk、app软件,应用商店,应用市场,app store,uni-app安卓苹果app上架应用商店,app应用从创建到上架_uniapp打包app的流程和上架,uniapp打包上架ios Appstore 最全流程,苹果应用商店上架教程,uniapp生成的app怎么上架到iphone的app store,uni-app打包到上架Android , ios完整详细流程,审核一直不通过,软件商店审核失

✅ 精选推荐文章 1万+

optee技术简介

OP-TEE(Open Portable Trusted Execution Environment)是一种开源的可信执行环境(TEE),专为ARM TrustZone架构设计。TEE是一种独立的执行环境,运行在主操作系统之外,为敏感任务提供安全的计算空间,如加密、身份验证、密钥管理等。

baron-周贺贺-代码改变世界ctw 1279

java死锁业务场景_【深入浅出多线程系列十二】:什么是死锁?(场景+代码示例)...

在学习Java的道路上,是否路过多线程时总让你很迷惘;很不巧,我也是,而使我们感到很迷惘主要原因都源于没有对概念的深深的理解和实践。所以我决定漫步Java多线程,同你一起会会多线程。多线程系列多线程系列一:理解多线程在于深深地理解了多任务、进程、多线程、线程多线程系列二:手撕多线程,从会三种创建多线程方式开始:除了常见的两种,你是否了解Callable接口方式?多线程系列三:初遇并发问题:从一个小...

weixin_28685287的博客 578

【AFAC2026金融智能-赛题四】我做了一个疯狂的决定,把Embedding和Reranker全删了

本文介绍了AFAC2026金融智能挑战赛赛道四的解题思路,核心是在500万token的严格限制下实现金融长文本的高效问答。作者通过四步流水线(规划、BM25检索、记忆压缩、LLM推理)优化流程,重点创新在于: 采用零API调用的纯BM25检索,配合多路查询、封面页加权和页面邻接扩展等策略 设计高效的检索算法,从问题中提取专有名词并构建多路查询组合 深入理解评分公式,平衡准确率和token消耗,最终在准确率提升的同时将token消耗从数百万降至百万级 这些创新使方案在严格限制下实现了性能突破,展示了在资源受限

227

硅基计划6.0 JavaEE 壹 多线程及核心内容

本文章主要讲解了多线程的线程安全问题,线程池,锁,阻塞队列,定时器等待内容

Pluchon的博客 946

LangChain .NET:C#开发者构建AI应用的RAG框架与实战指南

大语言模型(LLM)作为当前人工智能的核心技术,通过深度学习海量文本数据,掌握了强大的语言理解和生成能力。其原理基于Transformer架构,通过自注意力机制捕捉长距离依赖关系,从而实现对复杂语义的建模。这一技术价值在于能够将非结构化的自然语言转化为可计算、可推理的表示,为各类智能应用提供认知基础。在实际工程实践中,LLM常被应用于构建检索增强生成(RAG)系统和AI智能体(Agent)。RAG通过结合外部知识库检索与LLM生成,有效提升了问答的准确性和事实性,是构建企业知识库、智能客服等场景的关键技术。

weixin_42538175的博客 705

海思图像质量之HiPQTool调试

文章目录一. HiPQTool 界面二. 图像调试三. 将调试参数写入程序中 一. HiPQTool 界面 二. 图像调试 三. 将调试参数写入程序中

lzg2011的博客 2381

Java死锁原因及预防方法

在设计多锁交互时,强制全局一致的锁获取顺序是最有效且推荐的预防策略。善用Lock和tryLock当锁顺序难以严格保证或需要更灵活控制时,使用及其tryLock(带超时)方法,实现一次性申请所有锁或锁超时机制。务必在finally块中释放锁。最小化锁范围(缩小块)。优先使用并发集合 () 和原子变量。考虑不可变对象和线程本地存储 (尽量避免在一个锁保护的代码块内再去获取另一个锁。如果必须,严格应用锁顺序化。在可能长时间等待的地方(包括锁获取、条件等待、线程joinFuture.get。

走过冬季 1216

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

深入探讨 Java 多线程中的死锁与预防

在 Java 并发编程中,多线程虽能提升效率,但也可能引发死锁问题。死锁发生在多个线程因相互等待资源而陷入僵局,导致程序无法继续运行。本文探讨了死锁的定义、成因及预防策略,并通过代码示例展示了死锁的发生与解决方法。死锁的四个必要条件包括互斥、占有并等待、非抢占和循环等待。预防策略包括避免循环等待、最小化占有并等待、使用超时机制、资源分配图分析以及线程转储分析。通过统一锁顺序或引入超时机制,可以有效避免死锁,确保多线程程序的稳定运行。

静水深流 607

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

多线程之死锁

线程是操作系统能够进行运算调度的最小单位,他被包含在进程之内,是进程中实际运作的单位每一个线程都有独立的代码和数据空间线程在执行代码的时候线程在执行的时候 具有随机性CPU的执行权随时有可能被其他的线程抢走线程里有一个概念叫锁当有线程进入时 锁会自动关闭线程出去后锁会自动打开如果有线程先拿到锁的对象 获取了CPU的执行权其他的线程就算拿到CPU的执行权也会被关在外面其他线程抢到CPU执行权后会发现无法获得锁的对象此时锁已经关闭死锁就是线程1,2各自拿到了锁A,B的对象。

多多的博客 12万+

【并发编程 | 第二篇】如何理解多线程以及死锁

线程死锁描述的是这样一种情况:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方的资源,所以这两个线程就会互相等待而进入死锁状态。下面通过一个例子来说明线程死锁,代码模拟了上图的死锁的情况 (代码来源于《并发编程之美》)://资源 1//资源 2try {}, "线程 1").start();try {

2301_82014959的博客 796

Java多线程编程中的线程死锁

​PS:线程死锁是多线程编程中的一个常见问题,它发生在多个线程互相等待对方释放资源的情况下,导致程序无法继续执行。了解线程死锁的产生原因和示例,以及预防和解决线程死锁的方法,有助于帮助我们编写更多更加优良的多线程程序。作者:Stevedash发表于:2023年8月14日 20点25分Java 多线程编程 | 菜鸟教程 (runoob.com)注:本文内容基于个人学习理解,如有错误或疏漏,欢迎指正。

Stevedash的博客 782

【Linux】:线程安全 + 死锁问题

这篇主要是关于线程安全、重入、死锁问题的学习以及对互斥的一个补充,文章开篇我们先了解了线程安全以及可重入问题,后面讲了死锁的一系列知识,包括其概念、避免方法(银行家算法)以及其检测和解除,再后面我们了解了STL智能指针与线程安全的关系以及对互斥的深度理解,对我们之前学习的智能指针和互斥进行了一个补充

island1314的博客 1万+

什么是多线程死锁,如何预防和解决?

多线程死锁是多个线程因相互持有对方所需资源而陷入无限等待的状态。本文通过Java代码示例演示了死锁场景,并提出四种解决方案:1)固定资源获取顺序(破坏循环等待);2)一次性获取所有资源(破坏持有并等待);3)使用超时机制(破坏不可剥夺);4)定期检测与恢复。其中按固定顺序获取资源是最常用的预防方法。这些方法通过破坏死锁四大必要条件(互斥、持有并等待、不可剥夺、循环等待)来避免死锁发生。

X13100387636的博客 575

多线程(17)如何检测和预防死锁

检测和预防死锁是并发控制和操作系统设计的两个重要方面。了解如何检测和预防死锁不仅对于操作系统开发者重要,对于任何涉及并发和资源管理的应用程序开发者也同样重要。

qq_43012298的博客 635

Java的死锁

死锁(Deadlock)是多线程或多进程环境中的一种特定状况,当中涉及的线程或进程都在等待某个资源,但是这些资源又被这些线程或进程中的其他成员所持有,从而导致了无限期的等待,因此所有的线程或进程都无法向前推进执行。

weixin_63490470的博客 1557

Java并发编程--基础知识(进程,线程,多线程,死锁)

进程 (Process)在计算机中,每个进程都有自己独立的内存空间,包括代码、数据和堆栈等,同时拥有一组系统资源,如文件描述符、信号、处理器状态等。线程 (Thread)

weixin_64451672的博客 690
上一篇: JAVA基础-基于多线程的聊天程序
下一篇: JAVA基础-多线程入门(详解)
涵冰...
博客等级 码龄4年 2438粉丝 243原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涵冰...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值