多线程(死锁)

Python中多线程死锁问题的避免 策略适用场景注意事项固定锁顺序多锁竞争场景需全局统一锁的获取顺序超时机制可能发生短暂阻塞的场景平衡超时时间与系统响应速度队列化请求高并发资源访问引入队列可能降低吞吐量避免锁读多写少场景(如优先考虑无锁数据结构关键结论设计阶段:明确锁的边界和顺序,尽量使用不可变对象编码阶段:优先使用with语句和高级同步原语(如Queue测试阶段:通过压力测试和工具监控验证无死锁通过遵循这些原则,开发者可以显著降低Python多线程程序中的死锁风险。 阅读详情

多线程_死锁

第一部分

1、死锁的描述

|--你持有一个锁,我也持有一个锁,我要到你的里面去运行,我就要拿到你的锁,而你要到我的里面的来运行,你也要向我要锁,我不放我的锁,我要进你的里面去,你不放你的锁,你要到我的里面来,谁都不放,相持不下,这样就导致了死锁的发生;这个现象就导致了程序就挂那边不动了,
|--举例:你有一个筷子,我也有一根筷子,我说把你的筷子给我,我要吃饭,但是这是你也说让我把我的筷子给你,你也要吃饭,但是你不放你的筷子,我也不放我的这根筷子,咱们相持不下,谁都不要吃饭;

2、死锁的出现

|--通常死锁的出现都是同步中嵌套同步
|--要让一个同步函数进入到同步代码快里面,让一个同步代码快进入到一个同步函数里面;

3、死锁代码体现

class Ticket implements Runnable
{
	private int tick =800;
	Object obj = new Object();
	boolean flag = true;
	public void run()
	{
		if(flag)
			while(true)
			{
//			同步代码块里面有同步函数,同步代码快用的锁是obj,同步函数用的锁是this
				synchronized(obj)
				{
					show();
				}
			}
			else
				while(true)
					show();
	}
//	同步函数里面有同步代码块,this锁里面有obj锁
	public synchronized void show()
	{
		synchronized(obj)
		{
			if(tick>0)
			{
				try
				{
					Thread.sleep(10);
				}
				catch (Exception e)
				{
					System.out.println(e.toString());
				}
				System.out.println(Thread.currentThread().getName()+"--code--"+tick--);
			}
		}
	
	}
}



class DeadLockDemo
{
	public static void main(String[] args) 
	{
		Ticket t = new Ticket();

		Thread t1 = new Thread(t);
		Thread t2 = new Thread(t);
//		Thread t3 = new Thread(t);
//		Thread t4 = new Thread(t);

		t1.start();
		try
		{
			Thread.sleep(10);
		}
		catch (Exception e)
		{
			System.out.println(e.toString());
		}

		t.flag =false;
		t2.start();
//		t3.start();
//		t4.start();
	}
}
 

4、运行结果

第二部分

1、死锁程序

这个程序是a拿着a锁想要进b里面去,b拿着b的锁想要进a来,两者都拿着锁不放,都相持不下;
<span style="font-size:14px;">//面试时要写一个死锁</span><span style="font-size:18px;">
class Test implements Runnable
{
	private boolean flag;
	Test(boolean flag)
	{
		this.flag = flag;
	}
	public void run()
	{
		if(flag)
		{
//			用的是两个同步代码快,进行的验证,a锁里面有b锁,
			synchronized(MyLock.locka)
			{
				System.out.println("if locka");
				synchronized(MyLock.lockb)
				{
					System.out.println("if lockb");
				}
			}
		}
		else
		{
//			用的是两个同步代码块,b锁里面有a锁;
			synchronized(MyLock.lockb)
			{
				System.out.println("else lockb");
				synchronized(MyLock.locka)
				{
					System.out.println("else locka");
				}
			}
		}
	}
}
class MyLock
{
//静态直接有类名进行调用
	static Object locka = new Object();
	static Object lockb = new Object();
}
class DeadLockTest 
{
	public static void main(String[] args) 
	{
		Thread t1 = new Thread(new Test(true));
		Thread t2 = new Thread(new Test(false));
		t1.start();
		t2.start();
	}
}
</span>
 

2、运行结果

两者都拿着锁都不放,最后就锁住了;
要避免死锁的发生;

第三部分

我的总结

|--死锁的发生就是两个程序都拿着自己的锁,想要进入到对方的锁中,但是两者都是拿着锁不放,相持不下,最后就锁住了;
|--写程序时要避免死锁的发生;
|--死锁在面试的时候,会要求让你写一个死锁出来;
多线程中的死锁问题 多线程中的死锁问题 死锁问题概述 如果出现了同步嵌套,就容易产生死锁问题 是指两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待现象 死锁: 两个或者两个以上的线程, 在抢占CPU的执行权的时候, 都处于等待状态 举例: 中国人和美国人一起吃饭 中国人使用的筷子 美国人使用的刀和叉 中国人获取到了美国人的刀 美国人获取到了中国人的一根筷子 死锁在多线程中的含义 ​ 假如在Java多... 阅读详情

相关推荐

GPU运维工程师入门指南 (第九篇): 高性能网络 - InfiniBand与RDMA技术

本文介绍了支撑AI分布式训练的高性能网络技术InfiniBand和RDMA。传统TCP/IP网络因内核开销和内存拷贝成为性能瓶颈,而InfiniBand提供高带宽、低延迟的专用网络,RDMA则通过内核旁路和零拷贝技术实现节点间内存直接访问,显著提升通信效率。特别介绍了GPUDirect RDMA技术,使GPU显存可直接通信。文章还列举了运维人员在部署这些技术时需要考虑的硬件、驱动、配置和监控等关键点。这些技术共同构成了支撑大规模AI集群的"数据高速公路",为后续讨论存储性能瓶颈奠定了基础

weixin_42587823的博客 1100

黑马程序员———死锁

死锁:同步中嵌套同步 进程A占有资源R1,等待进程B占有的资源Rr;进程B占有资源Rr,等待进程A占有的资源R1。而且资源R1和Rr只允许一个进程占用,即:不允许两个进程同时占用。结果,两个进程都不能继续执行,若不采取其它措施,这种循环等待状况会无限期持续下去,就发生了进程死锁。   简单点说:有A和B两个线程,有CD 两把锁, A和B嵌套CD锁,A线程中有C,D锁,B线程中有D C两把锁,而

dantou7190的博客 483

【HAL库-STM】智能温控按键小风扇【胎教级教学】

硬件设备:DHT11,0.96寸oled屏,二/三/四线风扇(不挑),面包板 、f10的精英板等等。当人在的风扇面前时可以自行控制风扇,不在面前时又想开风扇就让他温控自行开启,(在这里有一个想法就是加上蓝牙和wifi控制的功能能够远程遥控,这个如果做的再全一点就要自主研发是一个多功能app,这里没有做。针对这个dht11,我一开始是卡在了这个check函数里面,一直是我给完dht11低电平和高电平后,dht11不回复我低电平和高电平,这个不是我的问题,当时代码是没毛病的,这个点一直卡着我。吐血五天实现小成品

weixin_52451652的博客 1741

黑马程序员_线程死锁

------- android培训、java培训、期待与您交流! ---------- 死锁 同步中嵌套同步   也就是有两个房子,A和B,主人A 拿着B房间的锁,B主人拿着A房间的锁,A拿不到B的锁,就进不去房间 而B拿不到A的锁,也进不去房间,两人相持不下 死锁属于操作系统的概念了……其实很好理解。最经典的例子就是,You first,You first问题。  一个门,两个“中国

yuanye806的专栏 492

Vivado IP核与License许可全解析:从免费到收费,从评估到部署

本文全面解析Vivado IP核与License许可机制,从免费到收费IP核的选型指南到License的申请与部署策略。详细介绍了Xilinx官方IP核的优势与局限,第三方IP核的风险与应对,以及实战中的资源优化技巧和版本兼容性问题,帮助开发者高效利用Vivado工具链。

weixin_29169505的博客 367

FPGA时序约束--实战篇(读懂Vivado时序报告)

本文将详细介绍如何读懂Vivado时序报告,包括报告的基本结构和如何分析报告。

mengzaishenqiu的博客 1万+

多线程——死锁

在我们使用多线程进行开发的时候,不可避免的会碰上死锁这类的问题,而这是我们在使用多线程中最常见的也是最棘手的问题,这篇文章就带你们初步的了解一下什么是死锁,以及如何避免死锁的产生。

comerun的博客 1191

ANSYS2022R1——安装源文件下载和安装教程——软件管家

14.当提示输入安装目录:#3时,①点击【浏览】,②选安装包解压后的【ANSYS2022R1_WINX64_Disk2】文件夹中【ANSYS2022R1_WINX64_Disk3】文件夹,③点击【选择文件夹】,④点击【OK】。12.当提示输入安装目录:#2时:①点击【浏览】,②选安装包解压后的【ANSYS2022.R1(64bit)】文件夹中的【ANSYS2022R1_WINX64_Disk2】文件夹,③点击【选择文件夹】,④点击【OK】。】②点击【OK】③点击【OK】。

qq_15963745的博客 2331

多线程死锁

死锁是并发编程中的难点,但通过合理设计和工具辅助,可以有效避免和解决!存在一个线程的循环等待链,每个线程都在等待下一个线程占用的资源。已分配给线程的资源不能被其他线程强制夺取,必须由线程主动释放。以下是死锁的核心概念、产生条件、排查方法和解决方案。线程持有至少一个资源,同时等待获取其他被占用的资源。资源一次只能被一个线程占用(如锁、文件句柄等)。(如一个同步方法调用另一个同步方法)。互斥:一个资源,只能被一个线程持有。支持可中断锁、公平锁、尝试锁等。支持可中断锁、公平锁、尝试锁等。

C18298182575的博客 716

SDR 和 DDR 的区别

SDR 和 DDR 的差别,最明显提现在传输速率和频率上。DDR SDRAM与SDRAM的基本结构是相似的,最根本的区别在于DDR 支持在一个时钟周期内传输两次数据,,SDR 只能传输一次数据。

串起点滴 1961

PaddleOCR全版本完整指南:从入门到精通,全面解析安装部署与高级应用

摘要 本文详细介绍了PaddleOCR的完整安装与使用指南。首先讲解了环境准备步骤,包括Python 3.11虚拟环境创建和PaddlePaddle框架的CPU/GPU版本安装。接着介绍了PaddleOCR库的安装方式,可选功能模块(文档解析、信息抽取、翻译等)及其依赖组。通过示例代码演示了PPStructureV3文档解析功能的基本用法,并提供了安装验证方法。最后针对常见问题(Windows中文用户名报错、模型下载问题)给出解决方案。文章为从入门到精通的PaddleOCR用户提供了全面的技术指导。

算法工程师 1367

多线程为什么会发生死锁,死锁是什么?死锁产生的条件,如何解决死锁?

死锁是在多线程或多进程环境下由于资源竞争而导致的系统僵局。了解和破坏死锁的四个必要条件,可以有效地预防或解决死锁问题。死锁是一种计算机系统中的状况,通常发生在多线程或多进程环境中。当多个线程或进程彼此等待对方持有的资源释放时,它们就陷入了一种永远无法继续执行的状态,这种情况称为死锁。

weixin_47151388的博客 741

【使用FPGA实现MIPI DSI接口】——如何使用FPGA实现MIPI DSI接口?这是一个让许多开发者都感到困扰的问题。本文将介绍如何使用FPGA设计和实现...

【使用FPGA实现MIPI DSI接口】——如何使用FPGA实现MIPI DSI接口?MIPI DSI(移动产业处理器接口 - 显示串行接口)是一种用于在移动设备中传输视频数据的标准接口,它是目前大部分智能手机和平板电脑所采用的显示接口。首先,我们需要实现MIPI DSI的物理层接口。在实现MIPI DSI接口后,我们还需要编写驱动程序来控制MIPI DSI显示屏显示图像。这里只是提供了MIPI DSI接口的物理层代码示例,完整的MIPI DSI接口实现需要包括控制器和驱动程序等更多内容。

uote_e的博客 2004

Java面试必问:死锁(多线程死锁+数据库死锁)

死锁是怎么造成的? 多线程锁定同一资源会造成死锁 线程池中的任务使用当前线程池也可能出现死锁 参考连接: https://blog.youkuaiyun.com/qq_35064774/article/details/51793656 情况一: 死锁是两个或多个线程互相等待对方所有用的资源情形:现在有线程1和线程2。线程1执行过程中,先锁定了对象a,然后需要再锁定b才能继续执行代码;而线程2正巧相反,先...

qq_37746483的博客 4301

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

java多线程避免死锁_多线程之死锁就是这么简单

前言只有光头才能变强回顾前面:本篇主要是讲解死锁,这是我在多线程的最后一篇了。主要将多线程的基础过一遍,以后有机会再继续深入!死锁是在多线程中也是比较重要的知识点了!那么接下来就开始吧,如果文章有错误的地方请大家多多包涵,不吝在评论区指正哦~声明:本文使用JDK1.8一、死锁讲解在Java中使用多线程,就会有可能导致死锁问题。死锁会让程序一直卡住,不再程序往下执行。我们只能通过中止并重启的方式来让...

weixin_42300121的博客 279

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

Java多线程之死锁(死锁产生条件、手写简单死锁程序、破坏死锁)(面试常有)

本篇博客主要学习和讨论的内容是:Java中小型面试经常出现的"死锁"、"死锁产生的四个必要条件"、"手写简单死锁程序"、"如何破坏死锁"等相关问题。里面详细的解读了实际生活"死锁"情形、程序"死锁"情形,并提到了如何解决该类"死锁"问题...

岁岁岁平安的博客 1898

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Qt多线程之死锁

目录 一、造成死锁的原因 现象分析 二、死锁的概念和发生条件 三、死锁的避免 四、避免死锁的示例代码 一、造成死锁的原因 一般性原则,每个临界资源都需要一个线程锁来进行保护,假设有多个线程锁该怎么设计程序呢?先来看以下的一个示例(代码很简单就不加注释了): #include <QCoreApplication> #include <QThread> #include <QMutex> #include <QDebug> int g_i_cu

Monkey_lwx的博客 4503

多线程的死锁问题

本文来说下多线程的死锁问题 文章目录死锁讲解 死锁讲解 在Java中使用多线程,就会有可能导致死锁问题。死锁会让程序一直卡住,不再程序往下执行。我们只能通过中止并重启的方式来让程序重新执行。 这是我们非常不愿意看到的一种现象,我们要尽可能避免死锁的情况发生! 造成死锁的原因可以概括成三句话: 当前线程拥有其他线程需要的资源 当前线程等待其他线程已拥有的资源 都不放弃自己拥有的资源 ...

wh柒八九的博客 943

多线程之死锁

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

多多的博客 12万+

【线程死锁】Android多线程死锁的产生以及如何避免

多线程,多进程的存在改善了系统资源的利用率,并提高了系统的处理能力,并发执行也带来了新的问题。—>死锁 一、死锁定义1、生活中的列子两人吃饭,但只有一双筷子, 2人轮流吃(同时拥有2只筷子才能吃), 某个时候一人拿了左筷子,一人拿了右筷子,两人同时占用一个资源,等待另一个资源, 这时候甲等乙吃完并释放他所占的筷子,而乙同样等待甲吃完并释放他所占有的筷子,这样就陷入了一个死循环,谁也无法继续吃饭

Tomasyb的博客 4402

多线程与死锁

多线程与死锁动态顺序锁死锁Jconsole 查看死锁固定锁顺序避免死锁协作锁之间发生死锁开放调用避免死锁RetreenLock锁超时解决死锁 Java多线程开发中,为了避免多个线程对同一份数据的操作,我们需要对我们的线程做加锁的操作,只要加锁,就必然存在锁竞争的问题,如果锁竞争的问题处理不当就会出现死锁问题。死锁会让程序一直卡住,程序不再往下执行。我们只能通过中止并重启的方式来让程序重新执行。 这...

灵动的艺术的博客 601

怎样排查多线程死锁问题?

在使用多线程进行开发,大概率会遇到死锁问题。如何排查死锁问题,也变得非常重要。 第一步,我们可以通过pstack 捕获当前程序运行栈的信息,多次捕获比较,就能找到死锁的地方。 接下来可以通过分析代码,如果比较简单,确定是四个必要条件(互斥、占有且等待、不可抢占、循环等待)其中之一,打破即可。如果无法定位,代码看不出什么问题,就要进行调试。 第二步,当发生死锁,gdb attach 进程,info thread 查看线程, thread N 切换线程,查找所等待的互斥量,是被那个线程占用,一步一步排查。

不才的专栏 2766

Java 多线程同步与死锁

在多线程中如何找到安全问题所在: 1,明确哪些代码是多线程运行代码 2,明确共享数据 3,明确多线程运行代码中哪些代码是操作共享数据的 静态的同步方法中,使用锁是该方法所在类的字节码文件对象,即 类名.class  前天俺们谈到了加锁,但是在使用加锁的同时又会带来一个问题,就是死锁。什么叫死锁? 所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而

百炼成钢 6733
上一篇: 多线程安全问题
下一篇: 多线程间通信
fyldragonfyl
博客等级 码龄12年 9粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值