死锁(面试常问)

1.什么是死锁

简单来说就是一个线程加锁后解锁不了

  1. 一个线程,一把锁,线程连续加锁两次。如果这个锁是不可重入锁,会死锁。
  2. 两个线程,两把锁。

举几个例子,1.钥匙锁车里了,车钥匙锁家里了。2. 现在有一本书和一支笔,A拿到书,B拿到笔;A说你把笔给我,我用完再把书给你;B说你把书给我,我用完笔给你。这个场景就相持不下了。

public static void main(String[] args) {
	Object locker1 = new Object();
	Object locker2 = new Object();
	Thread t1 = new Thread(()-> {
		synchronized (locker1) {
			System.out.println("t1线程获取Locker1");
			synchronized (locker2) {
				System.out.println("t1线程获取locker2");
			}
		}
	});
	Thread t2 = new Thread(() -> {
		synchronized (locker2) {
			System.out.println("t2线程尝试获取locker2");
			synchronized (locker1) {
				System.out.println("t2线程尝试获取locker1");
			}
		}
	});
	t1.start();
	t2.start();
}

image.png
上面代码就是两线程,两个锁造成了死锁。

  1. 多个线程,多把锁。

一个典型模型就是哲学家就餐问题,每个哲学家只会做两件事1.思考人生,啥也不干,阻塞等待;2.吃意大利面,先拿起左手的筷子,再拿起右手筷子。
image.png
如图,两个哲学家中间放一根筷子,当所有哲学家都拿起左边筷子时,想要再拿右边筷子,发现没筷子拿了,造成死锁。

2. 出现死锁的四个必要条件

  1. 互斥,锁A被线程1占有,线程2就没办法占有
  2. 不可抢占,锁A被线程1占有,线程2不能直接把锁A抢过来,阻塞等待
  3. 请求和保存,有多把锁,线程1拿到锁A之后,不想释放锁还想拿锁B
  4. 循环等待,线程1等待线程2释放锁,线程2等待线程3释放锁,线程3等待线程1释放锁

3.避免死锁的方案

只要打破上面四个必要条件任意一个即可解决。由于互斥和不可抢占是内核决定的无法改变。打破请求和保持,适用场景不多,要看需要场景是否允许。
打破循环依赖,约定好加锁顺序,就可以打破。像t1线程加锁顺序是locker1,locker2;t2线程加锁顺序是locker2,locker1这就导致循环依赖。如果我们给锁编号,约定加多个锁的时候,必须先加编号小的锁,后加编号大的锁,就能有效避免循环等待了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

两线制输入馈电型隔离变送器

两线制输入馈电型隔离变送器 产品型号:JSD TA-1021系列 馈电型隔离变送器产品介绍: JSD TA-1021 为两线制输入馈电型高精度隔离变送器,是将输入与输出之间电气绝缘的模拟信号量进行变换、放大、隔离及远传的小型仪表设备,接收仪表…

代码随想录算法训练营Day1 | 704.二分查找、27.移除元素

LeetCode 704 二分查找 题目链接:704.二分查找 本题思路:本题题目写的是二分查找,所以我们用到的算法肯定也是二分查找,需要定义 3个变量。 l: 从数组的下标0开始 r: 数组长度 - 1 mid:(l r)…

SQL进阶理论篇(二):数据库的设计范式

文章目录 简介数据库的设计范式有哪些数据库中的几种键从1NF到3NF1NF2NF3NFBCNF(巴斯范式) 反范式设计反范式的适用场景总结参考文献 简介 本小节主要内容: 数据库的设计范式都有哪些数据库的键都有哪些1NF、2NF和3NF都是指什么&#xff1f…

基于Dockerfile创建LNMP

实验组件 172.111.0.10:nginx docker-nginx 172.111.0.20:mysql docker-mysql 172.111.0.30:php docker-php 实验步骤 1.建立nginx-lnmp镜像及容器 cd /opt mkdir nginx cd nginx/ --上传nginx-1.22.0.tar.gz和wordpress-6.4.2-zh_C…

【LeetCode每日一题】1904. 你完成的完整对局数

给你两个字符串 startTime 和 finishTime ,均符合 "HH:MM" 格式,分别表示你 进入 和 退出 游戏的确切时间,请计算在整个游戏会话期间,你完成的 完整对局的对局数 。 如果 finishTime 早于 startTime ,这表示…

欧拉函数与欧拉定理

文章目录 AcWing 873. 欧拉函数题目链接欧拉函数欧拉函数的证明思路CODE时间复杂度分析 AcWing 874. 筛法求欧拉函数题目链接问题分析与时间复杂度CODE思路 欧拉定理 AcWing 873. 欧拉函数 题目链接 https://www.acwing.com/activity/content/problem/content/942/ 欧拉函数 …

四六级高频词组7

目录 词组 其他文章链接: 词组 251. (be) equivalent to(equal in value, amount, meaning) 相等于, 相当于 252. in essence (in itsones nature) 本质上…

20、备忘录模式(Memento Pattern,不常用)

备忘录模式又叫作快照模式,该模式将当前对象的内部状态保存到备忘录中,以便在需要时能将该对象的状态恢复到原先保存的状态。 备忘录模式提供了一种保存和恢复状态的机制,常用于快照的记录和状态的存储,在系统发生故障或数据发生…

网络安全项目实战(三)--报文检测

6. TCP/IP协议栈及以太网帧 目标 了解TCP/IP协议栈的组织结构掌握以太网帧的数据格式定义能应用编码实现以太网帧的解析方法 6.1. TCP/IP 协议栈 TCP/IP网络协议栈分为应用层(Application)、传输层(Transport)、网络层&#xf…

【UML】第4篇 UML公共机制(补扩展机制)

目录 一、扩展机制 1.1 构造型 1.2 标记值(Tagged Value) 1.3 约束(Constraint) 上节扩展机制没有讲完,如上图。 一、扩展机制 1.1 构造型 UML中的扩展机制包括约束、构造型和标记值,其中的构造型定义…

yo!这里是Linux信号相关介绍

目录​​​​​​​ 前言 基本介绍 概念 信号列表 信号处理 产生(发送)信号 通过按键产生 系统函数产生 软件条件产生 硬件异常产生 阻塞信号 信号状态 sigset_t 状态相关函数 1.sigprocmask 2.sigpending 捕捉信号 内核态与用户态 捕捉过程 sigaction 后…

分库分表及ShardingShpere-proxy数据分片

为什么需要分库? 随着数据量的急速上升,单个数据库可能会QPS过高导致读写耗时过长而出现性能瓶颈,所以需要考虑拆分数据库,将数据库分布在不同实例上提升数据库可用性。主要的原因有如下: 磁盘存储。业务量剧增&…

nodejs项目设置全局变量(global)

文章目录 前言一、使用global二、解决type typeof globalThis has no index signature.ts问题1、新建 /types/global.d.ts文件2、或者直接在入口文件/src/index.ts定义 三、最终效果鼠标放在global上,可显示global的类型生效了~ ![在这里插入图片描述](https://img-…

I.MX RT1170双核学习(2):双核相互激活和启动流程

RT1170这个芯片带有双核:Cortex-M7和Corterx-M4,两个核都可以独立地运行,当然双核也可以同时运行。在上一篇文章中,介绍了一下在RT1170中消息模块MU的使用:双核通信之MU消息单元详解,因为这是双核之间用来通…

05 python数据容器

5.1 数据容器认识 5.2 python列表 5.2.1 列表的定义 演示数据容器之:list 语法:[元素,元素,....] #定义一个列表List List [itheima,uityu,gsdfg] List1 [itheima,6666,True] print(List) print(List1) print(type(List)) pr…

smartKettle离线部署及问题记录

目录 📚第一章 前言📗背景📗目的📗总体方向 📚第二章 部署📗源码下载📗后端部署📕导入后端项目📕修改settings.xml(自动下载相关jar包)📕 编译📕 …

0x13 链表与邻接表

0x13 链表与邻接表 数组是一种支持随机访问,但不支持在任意位置插入和删除元素的数据结构。与之相对应,链表支持在任意位置插入或删除元素,但只能按顺序依次访问其中元素。我们可以使用一个struct来表示链表的节点,其中可以存储任…

MySQL线上死锁案例分析

项目场景 项目开发中有两张表:c_bill(账单表),c_bill_detail(账单明细表),他们的表结构如下(这里只保留必要信息): CREATE TABLE c_bill_detail (id bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 主…

Gin之GORM 查询语句

前期工作可以看之前的(连接数据库;以及确定要操作的库) Gin之GORM 操作数据库(MySQL)-CSDN博客https://blog.csdn.net/m0_72264240/article/details/134948202?spm1001.2014.3001.5502这次我们操作gin库下的另外一个…

Lenovo联想拯救者Legion Y9000X 2021款(82BD)原装出厂Windows10系统

链接:https://pan.baidu.com/s/1GRTR7CAAQJdnh4tHbhQaDQ?pwdl42u 提取码:l42u 联想原厂WIN10系统自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、联想电脑管家等预装程序 所需要工具:16G或以上的U盘 文件格式&am…