死锁的成因以及解决方案(简析)

news2024/11/17 7:54:20

目录

一.为什么会产生死锁?

二.死锁产生的几个场景

一个线程一把锁的情况

关于可重入和不可重入锁的简单举例

两个线程两把锁的情况

多线程多把锁

 如何解决死锁


一.为什么会产生死锁?

简单来说,就是进程加锁之后,没有被解锁而处于一直等待的状态

二.死锁产生的几个场景

一个线程一把锁的情况

如果单个线程被连续加锁两次及以上,成为了不可重入锁,那么该线程就造成了死锁(一般的synchronized是可重入锁,不会造成死锁)

关于可重入和不可重入锁的简单举例

public class syn{
	public synchronized void do1(){
		System.out.println("执行1");
		do2();
	}
	public synchronized void do2(){
		System.out.println("执行2");
	}	
}

如果是不可重入锁,那么我们在执行完输出语句"执行1"之后,因为锁是任然在do1手中,没有释放,那么我们是不能执行do2(),这个语句的

但是如果是可重入锁,那么我们就能直接获取do2的锁,然后执行do2操作

两个线程两把锁的情况

线程一等待着线程二给自己释放锁,线程二等待着线程一给自己释放锁

多线程多把锁

经典案例:哲学家吃面

 总所周知,一般人吃面是需要两根筷子(用手抓就算了吧)

但是这里有五个哲学家(五把锁)对应着五个筷子(五个解锁)

如果出现一种比较极端的情况

大家都同时拿自己左手或者右手的筷子(同时都获取了一把锁)

那大家都吃不了(都解锁不了)

 所以总结一下,造成死锁的四个条件

1.互斥使用.锁A被线程1占用,线程2就用不了

2.不可抢占.锁A被线程1占用,线程2不能把锁A抢过来, 除非线程1主动释放锁

3.请求和保持.有多把锁,线程1拿到锁A后,不想释放锁A,还想拿到一个锁B

4.循环等待.线程1 等待 线程2释放锁,线程2 要释放锁得等待线程3 来释放锁,线程3 释放锁得等待线程1 释放锁

 如何解决死锁

一句话

破坏上诉四个条件的任意一个即可

但是条件一和条件二是锁的基本特性,没法改

条件三的话只要释放锁就行,但是在大多数场景下没办法直接释放

所以一般来说

我们都是破坏循环条件

对于上面的哲学家吃面的问题,我们就可以对筷子(锁)进行编号,控制哲学家们拿筷子的顺序,就能解决死锁

 教科书上一般采用银行家算法,但是现实中基本不太实用,有兴趣的同学自行了解本文不多赘述

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

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

相关文章

深入理解深度学习——BERT(Bidirectional Encoder Representations from Transformers):BERT的结构

分类目录:《深入理解深度学习》总目录 相关文章: BERT(Bidirectional Encoder Representations from Transformers):基础知识 BERT(Bidirectional Encoder Representations from Transformers&#xff09…

软件架构模式—分层架构

这是软件架构模式博客系列第 2 章,我们将讨论分层架构模式。 分层架构模式是一种n层模式,其中组件按照水平层次进行组织。这是设计大多数软件的传统方法,旨在实现自我独立。这意味着所有组件之间相互连接,但彼此之间不相互依赖。…

测试体系与测试方案设计

如果我们想要测试一个系统,我们得先需要了解被测系统架构 业务架构:业务模型分析技术架构:技术组件、通讯协议分析数据架构:数据模型、数据存储引擎分析 电子商城 Mall 开源项目技术架构 经典技术架构 网关产品 Nginx Apache HttpdWeb 应用开发 Vue.js React移动应…

福州大学学报退稿率【爬虫+数据处理】

目录 一、爬虫 二、数据处理 2.1 历年投稿总数: 2.2 各稿件状态比例: 2.3 历年退稿率 三、总结(福州大学学报退稿率) 一、爬虫 从福州大学学报微信公众号可以发现稿件状态的查询接口, 根据测试可知稿件号由年份与当…

Linux共享内存

博客内容:共享内存 文章目录 一、认识共享内存结构二、如何创建共享内存?1.创建共享内存2.关联进程,取消进程3.释放共享内存 三、代码示例总结 一、认识共享内存结构 共享内存 共享内存指 (shared memory)在多处理器的计算机系统中&#xff…

新手速成!如何使用ChatGPT成为你的导师

1. 写在前面 最近我发现咱们的团队现在是人手ChatGPT,不光是我们团队,我整个行业的人都在用它解决生活跟工作中遇到的问题。可以看到的是大家也都是对它赞赏度很高 本文我将为大家介绍如何更加高效的使用ChatGPT提高工作效率,面向ChatGPT编程…

JavaScript高级学习总结

函数作用域 函数内部声明的变量,在函数外部无法被访问函数的参数也是函数内部的局部变量不同函数内部声明的变量无法互相访问函数执行完毕之后,函数内部的变量实际被清空了 块作用域 let声明的变量会产生块作用域,var不会产生块作用域cons…

QT +OpenSSL配置

QT OpenSSL配置 1 查看自己QT支持的OPenSSL版本号1.1 查看版本号1.2 是否配置了OPenSSL 2 安装OPenSSL2.1 下载已经编译好的库2.2 自己编译代码2.2.1 下载perl2.2.1 下载OPenSSL源码 1 查看自己QT支持的OPenSSL版本号 1.1 查看版本号 新建项目testOpenSSLpro文件中加入QT ne…

(贪心) 649. Dota2 参议院 ——【Leetcode每日一题】

❓ 649. Dota2 参议院 难度:中等 Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇) Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过…

Debian11 dhclient 不自动执行问题

这两天用U盘安装Debian11,在”安装软件“一直提示失败,但可以跳过这一步继续往下安装,好在基本系统及grub能正常安装,最后系统也能正常起来了,但发现系统起来后没有ip地址,需要手动执行 dhclient 来获取ip。…

Java的第十二篇文章——集合

目录 第十二章 集合 学习目标 1. 集合框架的由来 2. 集合框架的继承体系 3. Collection接口 3.1 Collection接口的常用方法 4. Iterator接口 4.1 Iterator接口的抽象方法 4.2 获取迭代器接口实现类 4.3 迭代器的实现原理 4.4 并发修改异常 4.5 集合存储自定义对象并…

【Git常用命令及在IDEA中的使用】

Git常用命令及在IDEA中的使用 Git常用命令及在IDEA中的使用1 Git 概述1.1 Git 简介1.2 Git 下载与安装 2 Git 代码托管服务2.1 常用的Git 代码托管服务2.2 使用码云代码托管服务 3 Git 常用命令3.1 Git 全局设置3.2 获取 Git 仓库3.3 工作区、暂存区、版本库 概念3.4 Git工作区…

MyBatis面试题总结

1.概念/使用方法向的问题 1.1 什么是Mybatis? (1)Mybatis是一个半ORM框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。 (2&a…

​​​​SpringBoot 监控神器——Actuator 保姆级教程

pom.xml info beans conditions heapdump shutdown mappings threaddump loggers 端点 metrics 端点 自定义Endpoint 自定义监控端点常用注解 使用Filter对访问actuator做限制 Spring Boot Monitor做监控页面 SpringBoot自带监控功能Actuator,可以帮助…

Kubernetes学习笔记-kubernetes应用扩展(2)-使用kubernetes服务目录扩展kubernetes20230623

一、服务目录介绍 服务目录就是列出所有的服务的目录。用户可以浏览目录并自行设置目录中列出的服务实例,无须处理服务运行所需的pod、service、configmap和其他资源。这听起来和自定义网站资源很类似。 服务目录并不会为每种服务类型的api服务器添加自定义资源&a…

全栈开发实战那些事

文章目录 一个网站是怎么来的? Git篇隔离项目和原有Git工程联系Git冲突的原因通常有以下几种: IDEA篇IDEA常用操作Git可视化操作(提交代码前先pull更新merge最新版本一下再push,保证提交的最终项目是最新) IDEA中Git冲…

Jenkins 发送文件到远程服务器:Publish Over SSH 插件

Jenkins 发送文件到远程服务器:Publish Over SSH 插件 文章目录 Jenkins 发送文件到远程服务器:Publish Over SSH 插件一、Publish Over SSH 插件1、概述2、主要功能和特点3、插件主页4、安装 Publish Over SSH 插件5、配置远程主机 二、发送文件到远程主…

Python基础篇(七):面向对象的编程思想

面向对象 前言1. 面向对象编程思想1.1 面向对象的相关概念1.2 面向对象的三大特性 2. 类的定义2.1 使用class关键字定义类2.2 创建类对象并调用属性和方法 3.面向对象思想示例3.1 详细示例:图形类的设计3.2 基类 Shape3.3 子类 Circle3.4 子类 Rectangle3.5 使用图形…

【Java-SpringBoot+Vue+MySql】Day5-前端进阶

目录 一、Axios网络请求 中文文档: 安装: 导入: 使用方法: 基本语法: 生命周期函数: 二、前端路由VueRouter 视频:12.前端路由VueRouter_哔哩哔哩_bilibili 参考文档: 三、状态管理VueX …

Linux设备驱动程序(三)——字符驱动

文章目录 前言一、scull 的设计二、主设备号和次设备号1、设备编号的内部表达2、分配和释放设备编号3、主编号的动态分配 三、一些重要的数据结构1、文件操作(file_operation)2、文件结构(struct file)3、inode 结构 四、字符设备…