什么是线程死锁

死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资
源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推
进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进
程(线程)称为死锁进程(线程)。
多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线
程被无限期地阻塞,因此程序不可能正常终止。
如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方
的资源,所以这两个线程就会互相等待而进入死锁状态。

下面通过一个例子来说明线程死锁,代码模拟了上图的死锁的情况

 

public class DeadLockDemo {private static final Object resource1 = new Object();//资源 1private static final Object resource2 = new Object();//资源 2public static void main(String[] args) {new Thread(() -> {synchronized (resource1) {System.out.println(Thread.currentThread().getName() + "get resource1");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "waiting get resource2");synchronized (resource2) {System.out.println(Thread.currentThread().getName() + "get resource2");}}}, "线程 1---").start();new Thread(() -> {synchronized (resource2) {System.out.println(Thread.currentThread().getName() + "get resource2");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "waiting get resource1");synchronized (resource1) {System.out.println(Thread.currentThread().getName() + "get resource1");}}}, "线程 2---").start();}
}

 输出结果:

线程 1---get resource1
线程 2---get resource2
线程 2---waiting get resource1
线程 1---waiting get resource2
线程 A 通过 synchronized (resource1) 获得 resource1 的监视器锁,然后通
Thread.sleep(1000) ;让线程 A 休眠 1s 为的是让线程 B 得到CPU执行权,然
后获取到 resource2 的监视器锁。线程 A 和线程 B 休眠结束了都开始企图请求
获取对方的资源,然后这两个线程就会陷入互相等待的状态,这也就产生了死
锁。上面的例子符合产生死锁的四个必要条件。
  • 形成死锁的四个必要条件是什么

1. 互斥条件:线程(进程)对于所分配到的资源具有排它性,即一个资源只
能被一个线程(进程)占用,直到被该线程(进程)释放
2. 请求与保持条件:一个线程(进程)因请求被占用资源而发生阻塞时,对
已获得的资源保持不放。
3. 不剥夺条件:线程(进程)已获得的资源在末使用完之前不能被其他线程
强行剥夺,只有自己使用完毕后才释放资源。
4. 循环等待条件:当发生死锁时,所等待的线程(进程)必定会形成一个环
路(类似于死循环),造成永久阻塞
  • 如何避免线程死锁

我们只要破坏产生死锁的四个条件中的其中一个就可以了。
破坏互斥条件
这个条件我们没有办法破坏,因为我们用锁本来就是想让他们互斥的(临界资源 需要互斥问)。
破坏请求与保持条件
一次性申请所有的资源。
破坏不剥夺条件
占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占 有的资源。
破坏循环等待条件
靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。破坏循环 等待条件。
我们对线程 2 的代码修改成下面这样就不会产生死锁了。
    new Thread(() -> {synchronized (resource1) {System.out.println(Thread.currentThread().getName() + "get resource1");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "waiting get resource2");synchronized (resource2) {System.out.println(Thread.currentThread().getName() + "get resource2");}}
}, "线程 2---").start();
输出结果
线程 1---get resource1
线程 1---waiting get resource2
线程 1---get resource2
线程 2---get resource1
线程 2---waiting get resource2
线程 2---get resource2
我们分析一下上面的代码为什么避免了死锁的发生?
线程 1 首先获得到 resource1 的监视器锁,这时候线程 2 就获取不到了。然后
线程 1 再去获取 resource2 的监视器锁,可以获取到。然后线程 1 释放了对
resource1、resource2 的监视器锁的占用,线程 2 获取到就可以执行了。这样
就破坏了破坏循环等待条件,因此避免了死锁。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

喜讯!聚铭网络荣获“2023年网络安全十大优秀案例”称号

近日,由等级保护测评主办的2023年网络安全优秀评选活动结果正式公布。聚铭网络凭借其卓越的技术实力和优秀的项目实施能力,成功荣获“2023年网络安全十大优秀案例”称号。 为了挖掘网络安全行业优秀企业、案例与产品,充分发挥优秀网安企业各…

Sulfo Cy2 Biotin,水溶性 Cy2 生物素,能够与各种氨基基团特异性结合

您好,欢迎来到新研之家 文章关键词:Sulfo Cyanine2 Biotin,Sulfo Cy2 Biotin,水溶性 Cy2 生物素,Sulfo-Cy2-Biotin,水溶性-Cy2-生物素 一、基本信息 产品简介:Sulfo Cyanine2 Biotin, also k…

开源运维平台Spug本地docker部署结合内网穿透实现远程访问

文章目录 前言1. Docker安装Spug2 . 本地访问测试3. Linux 安装cpolar4. 配置Spug公网访问地址5. 公网远程访问Spug管理界面6. 固定Spug公网地址 前言 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台,整合了主机管理、主机批量执行、主机在线终端、文件…

OceanBase创建租户

租户是集群之上的递进概念,OceanBase 数据库采用了多租户架构。 集群偏部署层面的物理概念,是 Zone 和节点的集合,租户则偏向于资源层面的逻辑概念,是在物理节点上划分的资源单元,可以指定其资源规格,包括…

from sklearn.preprocessing import LabelEncoder的详细用法

sklearn.preprocessing 0. 基本解释1. 用法说明2. python例子说明 0. 基本解释 LabelEncoder 是 sklearn.preprocessing 模块中的一个工具,用于将分类特征的标签转换为整数。这在许多机器学习算法中是必要的,因为它们通常不能处理类别数据。 1. 用法说…

五款焊在电脑上的效率软件

在当今快节奏的商业环境中,提高工作效率成为了每个人都渴望实现的目标。尤其是在面对繁忙的工作日程、庞杂的任务清单和团队合作的压力时,我们需要一些可靠的工具来帮助我们更好地管理时间、组织工作和提高生产力。幸运的是,现在有许多高效的…

VC++中使用OpenCV进行人脸检测

VC中使用OpenCV进行人脸检测 对于上面的图像,如何使用OpenCV进行人脸检测呢? 使用OpenCV进行人脸检测十分简单,OpenCV官网给了一个Python人脸检测的示例程序, objectDetection.py代码如下: from __future__ import p…

Pandas ------ 向 Excel 文件中写入含有 multi-index 和 Multi-column 表头的数据

Pandas ------ 向 Excel 文件中写入含有 multi-index 和 Multi-column 表头的数据 引言正文 引言 之前在 《pandas向已经拥有数据的Excel文件中添加新数据》 一文中我们介绍了如何通过 pandas 向 Excel 文件中写入数据。那么对于含有多表头的数据,我们该如何将它们…

STM32_JTAG引脚及复用代码

目录 1.JTAG引脚1.1 说明(可以不看)1.2 引脚 2.复用代码3. 手册介绍(可以不看) 总是忘记有些引脚是JTAG复用的,导致偶尔浪费一些时间,记录一下。 1.JTAG引脚 1.1 说明(可以不看) …

【jetson笔记】vscode远程调试

vscode安装插件 vscode安装远程插件Remote-SSH 安装完毕点击左侧远程资源管理器 打开SSH配置文件 添加如下内容,Hostname为jetson IP,User为登录用户名需替换为自己的 Host aliasHostName 192.168.219.57User jetson配置好点击连接,控制台输…

全国首个!华为5.5G新突破:速率最高超4Gbps

“华为中国”官微宣布,近日,山东移动联合华为在青岛城区完成500个三载波聚合站点规模开通,标志着山东移动成为全国首个实现百站三载波聚合连片部署的运营商。 本次开通三载波聚合站点覆盖五四广场、八大关、青岛北站、中国海洋大学等热点区域…

谷粒商城配置虚拟机

一、创建虚拟机 之前有在VM里面建一个ubuntu的虚拟机,准备拿来直接用,网络设置为NAT模式,查看我的虚拟机是虚拟机:192.168.248.128 主机: 192.168.2.12。可以互相ping通。 二、linux安装docker Docker docker是虚拟…

威联通QNAP NAS结合cpolar内网穿透实现公网远程访问NAS中存储的文件

文章目录 推荐 前言1. 威联通安装cpolar内网穿透2. 内网穿透2.1 创建隧道2.2 测试公网远程访问 3. 配置固定二级子域名3.1 保留二级子域名3.2 配置二级子域名 4. 使用固定二级子域名远程访问 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣…

解决Xcode报错Stored properties cannot be marked unavailable with ‘@available‘

出现场景 打开一个IOS老项目时,Xcode提示以下错误 available(iOS, unavailable) //Stored properties cannot be marked unavailable with available解决方案 我们只需要把unavailable改成*号,同时增加版本号的限制。 // available(iOS, unavailabl…

Linux sudo与/etc/sudoers

sudo介绍 sudo命令可以让普通用户在执行需要超级用户权限的命令时,临时提升为超级用户。例如,普通用户可以使用sudo执行系统管理任务,如安装软件、修改系统配置等。访问控制:sudo命令通过sudoers文件中的配置,可以对用…

【AI绘画】Stable Diffusion使用入门教程!!!!

手把手教你入门绘图超强的AI绘画,用户只需要输入一段图片的文字描述,即可生成精美的绘画。给大家带来了全新保姆级教程资料包 (文末可获取) 首先提几个好玩的名词: 炼丹:训练AI学习图片生成模型 咒语&…

CES 2024的亮点仅仅聚焦AI深度赋能和产业创新吗?| DALL-E 3、Stable Diffusion等20+ 图像生成模型综述

随着科技飞速发展,CES(国际消费电子展)已然成为全球科技产业的风向标,每年的CES大会都是业界瞩目的盛事。回顾2024年CES大会,不难发现其亮点纷呈,其中以人工智能的深度赋能为最引人注目之处。AI技术的深入应…

如何在Linux环境下安装Redis呢?

第一步:创建存放redis存放的文件夹 mkdir /usr/local/redis使用cd切换到上述创建的目录 第二步:从官网下载redis压缩包 wget https://download.redis.io/releases/redis-6.0.5.tar.gz下图为下载成功示例 第三步:解压下载的压缩包 tar -zv…

TA百人计划学习笔记 3.1.2深度测试

资料 源视频 【技术美术百人计划】图形 3.1 深度与模板测试 传送门效果示例_哔哩哔哩_bilibili ppt 3100-模板测试与深度测试(1) 参考 Unity Shader: 理解Stencil buffer并将它用于一些实战案例(描边,多边形填充,反射区域限定,阴影…

文字转语音在线合成掩码系统 让你的文字自动转为语音 带完整的安装部署教程

互联网的快速发展,人们对文字转语音(TTS)的需求日益增长。无论是需要为视障人士提供语音阅读的内容,还是想要为视频内容添加语音旁白,都需要一个高效、准确的文字转语音系统。然而,市面上的许多TTS工具都存…