Java多线程编程学习——03线程死锁

C#上位机与OneNET云平台数据交互实战——基于HTTP与JSON解析 本文详细介绍了使用C#开发上位机软件与OneNET物联网云平台进行数据交互的实战方法。通过构建HTTP请求、解析JSON数据,实现设备数据的实时获取、界面展示与本地存储,为工业监控与数据采集提供了一套完整高效的C#解决方案。 阅读详情



什么是死锁?

多个线程抢占同一资源,并请求锁定对方资源,造成恶性循环且无外力情况下无法执行下去的情况叫做死锁。

死锁产生的四个必要条件

互斥条件

线程(进程)要求对所分配的资源具有排他性,即在一段时间内某个资源被当前线程(进程)所占有,其他线程(进程)若想请求获得该资源只能等待。

不可剥夺条件

线程(进程)请求锁定某个资源未释放之前,其他线程(进程)不可抢占和剥夺该线程所持有的资源,必须等待该线程(进程)执行完成释放该资源后才可获得。

请求与保持条件

已拥有资源的线程(进程)二次请求新的资源,而该资源已被其他线程(进程)所占有,此时请求阻塞并对其原持有的资源保持不放。

循环与等待条件

存在一种请求资源得循环等待链,链中每一个线程(进程)已获得资源的同时并请求新的资源,形成闭路循环等待,造成阻塞。


死锁处理

  • 预防死锁:通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或几个条件,来防止死锁的发生。
  • 避免死锁:在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免死锁的发生。
  • 检测死锁:允许系统在运行过程中发生死锁,但可设置检测机构及时检测死锁的发生,并采取适当措施加以清除。
  • 解除死锁:当检测出死锁后,便采取适当措施将进程从死锁状态中解脱出来。

死锁预防

预防死锁是设法至少破坏产生死锁的四个必要条件之一,严格的防治死锁的出现。

破坏“互斥”条件

"互斥”条件是无法破坏的,资源的互斥本身就是对死锁的一种预防。

破坏“请求与保持”条件

一次性分配所需资源

破坏“不可剥夺”条件

如果已占有资源的线程(进程)进一步请求新的资源失败,则该线程(进程)必须释放它已持有的资源。

破坏“循环与等待”条件

按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。破坏循环等待条件。


死锁避免

有序资源分配法
  1. 必须为所有资源统一编号
  2. 同类资源必须一次申请完
  3. 不同类资源必须按顺序申请

例如:有两个进程P1和P2,有两个资源R1和R2
P1请求资源:R1、R2
P2请求资源:R1、R2
这样就破坏了环路条件,避免了死锁的发生。

银行家算法

银行家算法(Banker’s Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。流程图如下:

在这里插入图片描述
银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若为是,才分配。它是最具有代表性的避免死锁的算法。
设进程i提出请求REQUEST [i],则银行家算法按如下规则进行判断。

  1. 如果REQUEST [i]<= NEED[i,j],则转(2);否则,出错。
  2. 如果REQUEST [i]<=
    AVAILABLE[i],则转(3);否则,等待。
  3. 系统试探分配资源,修改相关数据:
    AVAILABLE[i]-=REQUEST[i];//可用资源数-请求资源数
    ALLOCATION[i]+=REQUEST[i];//已分配资源数+请求资源数
    NEED[i]-=REQUEST[i];//需要资源数-请求资源数
  4. 系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

顺序加锁

当多个线程(进程)需要相同的一些锁,但是按照不同的顺序加锁,死锁就很容易发生。如果能确保所有的线程(进程)都是按照相同的顺序获得锁,那么死锁就不会发生。

按照顺序加锁是一种有效的死锁预防机制。但是,这种方式需要事先知道所有可能会用到的锁,但总有些时候是无法预知的,所以该种方式只适合特定场景。


限时加锁

限时加锁是线程(进程)在尝试获取锁的时候加一个限制时间,若超过这个时间则放弃对该锁请求,并回退释放所有已经获得的锁,然后等待一段随机的时间再重试

缺点

  1. 当线程(进程)数量少时,该种方式可避免死锁,但当线程(进程)数量过多,这些线程(进程)的加锁时限相同的概率就高很多,可能会导致超时后等待死循环。
  2. Java中不能对synchronized同步块设置超时时间。需要创建一个自定义锁,或使用Java5中java.util.concurrent包下的工具。

死锁检测

预防和避免死锁系统开销大且不能充分利用资源,更好的方法是不采取任何限制性措施,而是提供检测和解脱死锁的手段,这就是死锁检测和恢复。
死锁检测数据结构:

  • E是现有资源向量(existing resource vector),代码每种已存在资源的总数
  • A是可用资源向量(available resource vector),那么Ai表示当前可供使用的资源数(即没有被分配的资源)
  • C是当前分配矩阵(current allocation matrix),C的第i行代表Pi当前所持有的每一种类型资源的资源数
  • R是请求矩阵(request matrix),R的每一行代表P所需要的资源的数量

在这里插入图片描述

死锁检测步骤

  1. 寻找一个没有结束标记的进程Pi,对于它而言R矩阵的第i行向量小于或等于A。
  2. 如果找到了这样一个线程(进程),执行该线程(进程),然后将C矩阵的第i行向量加到A中,标记该线程(进程),并转到第1步
  3. 如果没有这样的线程(进程),那么算法终止
  4. 算法结束时,所有没有标记过的进程都是死锁线程(进程)。

死锁恢复

利用抢占恢复。

临时将某个资源从它的当前所属进程转移到另一个线程(进程)。 这种做法很可能需要人工干预,主要做法是否可行需取决于资源本身的特性。

利用回滚恢复

周期性的将线程(进程)的状态进行备份,当发现线程(进程)死锁后,根据备份将该线程(进程)复位到一个更早的,还没有取得所需的资源的状态,接着就把这些资源分配给其他死锁线程(进程)。

通过杀死线程(进程)恢复

最直接简单的方式就是杀死一个或若干个线程(进程)。
尽可能保证杀死的线程(进程)可以从头再来而不带来副作用。

Ubuntu22.04上如何用Docker一键部署Ragflow+Ollama(附CUDA配置避坑指南) 本文详细介绍了在Ubuntu22.04系统上使用Docker一键部署Ragflow+Ollama的完整流程,特别提供了CUDA配置的避坑指南。从硬件兼容性检查、驱动安装到容器网络配置,手把手教你搭建本地化大模型环境,解决CUDA驱动冲突等常见问题,助力开发者快速构建AI应用开发平台。 阅读详情

相关推荐

西门子S7-1200与S7-200SMART的PROFINET通讯实战:从GSD文件生成到数据监控

本文详细解析了西门子S7-1200与S7-200SMART之间实现PROFINET通讯的完整实战流程。核心内容包括将S7-200SMART配置为智能IO设备、生成并安装GSD文件、在TIA Portal中进行网络组态与地址映射,最终实现双向数据交换与监控。该方案为整合新旧设备、构建灵活高效的工业自动化系统提供了可靠路径。

weixin_29271263的博客 246

Java day17:多线程(JavaSE最后一节知识点课)

一、程序、进程与多任务 程序(program)是对数据描述与操作的代码的集合,是应用程序执行的脚本。 进程( process)是程序的一次执行过程,是系统运行程序的基本单位。 程序是静态的,进程是动态的。系统运行一个程序即是一个进程从创建、运行到消亡的过程。 多任务(multi task)在一个系统中可以同时运行多个程序,即有多个独立运行的任务,每个任务对应一个进程。 什么是并发与并行 要想学习多线程,必须先理解什么是并发与并行 并行:指两个或多个事件在同一时刻发生(同时发生)。 并发:指两

weixin_44641804的博客 1527

Dify工作流自动化:如何用Trae AI助手10倍提升你的开发效率(含避坑指南)

本文详细介绍了如何利用Trae AI助手自动化生成Dify工作流,实现开发效率的10倍提升。通过构建DSL示例库、精准需求描述和四步实战法,开发者可将重复的配置工作交给AI,快速生成可运行的工作流,并提供了关键的避坑指南。

weixin_29062865的博客 370

多线程面试必备知识点(二)

​1. 线程安全问题 1.1. 什么是线程安全 如果有多个线程同时运行同一个实现了Runnable接口的类,程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的;反之,则是线程不安全的。 1.2. 问题演示 1.2.1. 第一步:创建售票线程类 1.2.2. 第二步:创建测试类 运行结果如下: 程序出现了两个问题: 相同的票数,比如5这张票被卖了两回...

I_believe_I_sucess的博客 447

大疆Livox Mid-70雷达的使用

一、前期准备 (一)、使用Livox Viewer测试雷达 1、设置静态IP sudo ifconfig enx081f7152092a 192.168.1.50 查看IP是否设置成功 lacyexsale@lacyexsale-KLV-WX9:~$ ifconfig enx081f7152092a Link encap:以太网 硬件地址 08:1f:71:52:09:2a inet 地址:192.168.1.50 广播:192.168.1.255 掩码:255.255.25

LacyExsale的博客 1万+

别再用Excel画波特图了!用LTspice免费仿真软件,5分钟搞定电路传递函数分析

本文介绍了如何利用LTspice免费仿真软件高效绘制波特图,解决传统Excel绘图效率低、精度不足的问题。通过详细的操作步骤和实战案例,展示LTspice在电路传递函数分析中的自动化计算、专业级精度和完整特性展示等优势,帮助工程师快速完成频率响应分析。

weixin_42524226的博客 461

线程学习二

1.线程生命周期 1.1新建 new关键字创建了一个线程之后,该线程就处于新建状态 JVM为线程分配内存,初始化成员变量值 1.2就绪 当线程对象调用了start()方法之后,线程就处于就绪状态 JVM为线程创建方法栈和程序计数器,等待线程调度器调度 1.3运行 就绪状态的线程获取CPU资源,开始运行run()方法,该线程进入运行状态 1.4阻塞 当发生如...

qq_37664264的博客 478

Matlab图像处理频域滤波实现——高斯低通、高通、带通带阻滤波器

如果你想要进一步了解更多的相关知识,

小嘤熊的博客 1万+

Java多线程教程(作者原创)

Java多线程并发编程。

Yyyy的博客 3923

【AI大模型应用开发】【LangChain系列】实战案例6:利用大模型进行文本总结的方法探索,文本Token超限怎么办?

假设有一组文档(PDF、Notion页面、客户问题等),你想要总结内容。可以利用大模型来帮你。今天来系统看下利用大模型来对文本进行总结的方法,以LangChain的使用为例。

同学小张的博客 3749

Linux(31)Rockchip RK3568 Ubuntu22.04上部署 Docker: 问题与解决方案

本博客在总结这些问题及其解决方案,为遇到类似问题的兄弟提供参考,如果我后续有碰到其他Docker 问题也会在此更新补充。

我其实什么都不会 1646

java多线程并发之旅-01-多线程并发教程概览

本系列学习目的 提升对于 java 多线程的理解,要学会横向对比学习,多看些文章。 目前大部分的文章都是止步于创建和常见的类,本系列重在实践,参考书籍《java 并发编程实战》《Java并发编程的艺术》 后续原理参考《深入理解并行编程》。 对于 java 多线程的基础知识,参考 Java Thread 小结 经典书籍《图解 Java 多线程设计模式》 系列学习笔记。 对于 jvm 相关知识不用重复...

1万+

YOLO11改进:轻量级改进 | 通用倒瓶颈(UIB)搜索块结合C3k2二次创新 | 轻量化之王MobileNetV4

通用倒瓶颈(UIB)搜索块替代YOLO11的C3k2

会AI的学姐 293

Java多线程编程【一文全解】

Java多线程从0到1全讲解

Lov1_BYS的博客 1569

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java线程避免死锁_如何避免多线程死锁?多线程死锁的原因和幸免策略

在多线程编程过程中,不仅仅要解决数据访问的同步与互斥,还要注意多线程的死锁问题,而造成多线程死锁的原因大概可以归咎于系统资源不足、进程推进顺序不当或者资源分配不当等问题。有什么方法可以避免多线程死锁的形成吗?请看下文。一、死锁原因与形成条件:死锁形成的原因:1、系统资源不足;2、进程(线程)推进的顺序不恰当;3、资源分配不当。从编程经验上来讲,形成死锁的一般原因有以下几种:1、个人使用锁的经验差异...

weixin_31557179的博客 359

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java多线程死锁例子

目录一、产生死锁的原因二、如何避免死锁 一、产生死锁的原因 发生死锁的情况: 多个线程需要同时占用多个共享资源而发生需要互相死循环等待的情况,就是,两个线程互相等待着对象释放锁,一直这样僵持下去,所以导致了死锁的产生。 产生死锁代码: package com.javaagent.thread; public class DieThread implements Runnable { p...

Davis 839

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

03 Java多线程及并发 为什么说线程是不安全的,怎么排查死锁问题

Java多线程及并发线程是不安全线程的安全问题(竞争条件)原子性 (Atomicity)逻辑上没问题的代码,在多线程的环境下却暗藏杀机如何处理线程的安全问题不可变对象加各种锁并发工具包听天由命式编程死锁简单的死锁 示例排查解决避免原则 线程是不安全 一段代码如果在多线程情况下,执行的结果和预期的不符合,就是线程不安全。 为什么说线程是不安全的?话不多说直接上代码。 只有一个main线程时: public class ThreadUnSafe { private static int globalI

思念十年后 423

多线程学习

多线程(多线程的引入) 多线程(多线程并行和并发的区别) 多线程(Java程序运行原理和JVM的启动是多线程的吗) 多线程(多线程程序实现的方式1) 多线程(多线程程序实现的方式2) 多线程(实现Runnable的原理) 多线程(两种方式的区别) 多线程(匿名内部类实现线程的两种方式) 多线程(获取名字和设置名字) 多线程(获取当前线程的对象) 多线程(休眠线程) 多线程(守护...

qq_35337695的博客 3015

java多线程与死锁_java多线程死锁 Java线程同步与死锁(死锁)

Java 线程同步与死锁 学习笔记Java 线程同步与死锁 学习笔记1 多线程共享数据2 线程同步3 同步准则4 线程死锁1、 多线程共享数据在多线程操作中,多个线程可能同时处理同一个资源...haha_zhan2016年09月25日 10:0210431.线程同步多线程引发的安全问题一个非常经典的案例,银行取钱的问题。假如你有一张银行卡,里面有5000块钱,然后你去银行取款2000块钱。正在你取...

weixin_31921223的博客 280

Java多线程之 《死锁》示例

package concurrent; /** * Desc:死锁Demo * Creator: pengweixiang * Date: 2019-03-23 */ public class DeanLockDemo { private static Object A = new Object(); private static Object B = new Objec...

pengweixiang的博客 216

linux查看java线程死锁_ccriticalsection 多线程 死锁_c++ 线程死锁_linux 线程 死锁

qq_407283393122018-12-10一个很蠢的造成死锁的问题wanglt3113172018-12-12什么是死锁,死锁的原因,如何避免apanying902019-01-09c3p0连接死锁Cain_1507662016-09-20notify产生死锁的场景(备忘)liuchuanyangyan9132017-02-23C3P0配置错误导致的连接关闭问题iteye_143523112...

weixin_35073484的博客 355

多线程 05:线程同步,三大不安全案例分析,synchronized 和 Lock 的应用,以及死锁相关知识

本文讲述线程同步相关知识,包括线程同步机制,线程同步涉及的三大不安全案例(不安全买票 / 取款 / 集合),及这些案例的完善方法。同时,通过 synchronized(同步)和 Lock(锁),我们能解决多线程共享资源引起的访问冲突,实现线程同步。此外,文章还介绍了死锁的知识,如死锁产生的条件,死锁的案例,以及如何避免死锁等。

积累,沉淀,温故而知新 1653

Java多线程——Day03

多线程Day 03 本文总结自B站狂神说JAVA 1. 线程同步 在Day01中有一个多个线程操作同一个对象的案例,没有处理好并发,所以出现了错误。解决方案:将需要同时访问该对象的线程进入这个对象的等待池形成队列,等前面的线程完毕,下一个线程才可以继续使用,这种方案叫做线程同步。线程同步必须要有队列和锁。说到底线程同步是用来解决线程的安全性问题。缺陷:会损失一部分性能,一个有锁的线程会导致其它需要此锁的线程挂起;一个优先级高的线程如果等待一个优先级低的线程的锁,会导致优先级倒置。 加锁的方法是:在需要同

风间琉璃の博客 177

Java线程死锁及解决方法(Jstack)

多线程环境下,死锁即两个或两个以上的线程去争夺同一个共享资源,而导致互相等待的情况。

努力学习的DS 2203

Java-Thread00之多线程知识准备

------ 我 QQ:1755497577(备注:博客) B站:code_ant(java相关培训视频) 简述 之前对多线程一直有排斥心理,每一次学一点点就放弃了,最近狠下心来从新学习,顺便做一个笔记,供大家参考一下。 demo:https://github.com/LiJinHongPassion/ThreadTest 后期学习目录 thread01:创建线程thread02:线程...

qq_37513473的博客 1万+

Java-多线程

1.线程由进程创建的,是进程的一个实体2.一个进程可以拥有多个线程。

weixin_74816332的博客 769
上一篇: Java多线程编程学习——02线程安全问题
下一篇: 设计模式学习——享元模式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值