Java SE入门及基础(61) 死锁 死锁发生条件

目录

死锁

1. 死锁的概念

2. 死锁发生条件

互斥条件

不可剥夺条件

请求与保持条件

循环等待

3. 案例分析

示例

分析


死锁

1. 死锁的概念

        Deadlock describes a situation where two or more threads are blocked forever, waiting for each other
        死锁描述了一种情况,其中两个或多个线程永远被阻塞,互相等待

2. 死锁发生条件

互斥条件
        线程要求对所分配的资源进行排他性控制,即在一段时间内某资源仅为一个线程所占有。此时若有其他线程请求该资源,则请求线程只能等待。
不可剥夺条件
        线程所获得的资源在未使用完毕之前,不能被其他线程强行夺走,即只能由获得该资源的线程自己来释放(只能是主动释放)。
请求与保持条件
        线程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他线程占有,此时请求线程被阻塞,但对自己已获得的资源保持不放。
循环等待
        存在一种线程资源的循环等待链,链中每一个线程已获得的资源同时被链中下一个线程所请求。

3. 案例分析

示例
public class DeadLockTest {public static void main(String[] args) {Object o1 = new Object();Object o2 = new Object();DeadLockTask task1 = new DeadLockTask(o1, o2, 0);DeadLockTask task2 = new DeadLockTask(o1, o2, 1);Thread t1 = new Thread(task1);Thread t2 = new Thread(task2);t1.start();t2.start();}static class DeadLockTask implements Runnable{private Object o1, o2;private int flag; //锁使用的条件public DeadLockTask(Object o1, Object o2, int flag) {this.o1 = o1;this.o2 = o2;this.flag = flag;}@Overridepublic void run() {String name = Thread.currentThread().getName();if(flag == 0){synchronized (o1){System.out.println(name + "锁定对象o1");try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}synchronized (o2){System.out.println(name + "锁定对象o2");}}} else {synchronized (o2){System.out.println(name + "锁定对象o2");try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}synchronized (o1){System.out.println(name + "锁定对象o1");}}}}}
}
分析
        线程t1 开始执行,首先会将持有对象 o1 的锁,然后开始睡眠 0.5 秒,此时,线程 t2 开始执行,首先会持 有对象o2 的锁,然后开始睡眠 0.5 秒。
        线程t1 睡眠结束,尝试获得对象 o2 的锁,此时发现对象 o2 已经被其他线程 t2 锁住,此时 t1 被阻塞在外,等待对象o2 上的锁释放。
        线程t2 睡眠结束,尝试获得对象 o1 的锁,此时发现对象 o1 已经被其他线程 t1 锁住,此时 t2 被阻塞在外,等待对象o1 上的锁释放。

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

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

相关文章

帧布局的概念与属性

帧布局(FrameLayout)顾名思义就是将控件一层一层叠在一起,像视频的帧一样,一层叠一层,如图所示,帧布局中BUTTON叠在ImageView之上。帧布局常见的属性见表1。帧布局中的控件可以使用android:layout_gravity&…

论文复现-基于决策树算法构建银行贷款审批预测模型(金融风控场景)

作者Toby,来源公众号:Python风控模型,基于决策树算法构建银行贷款审批预测模型 目录 1.金融风控论文复现 2.项目背景介绍 3.决策树介绍 4.数据集介绍 5.合规风险提醒 6.技术工具 7.实验过程 7.1导入数据 7.2数据预处理 7.3数据可…

Spring Boot中的数据迁移策略

Spring Boot中的数据迁移策略 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 一、引言 在软件开发的过程中,经常会遇到需要修改数据库结构、迁移…

SpringBoot3+Vue3开发园区管理系统

介绍 在当今快速发展的城市化进程中,高效、智能的园区管理成为了提升居民生活品质、优化企业运营环境的关键。为此,我们精心打造了全方位、一体化的园区综合管理系统,该系统深度融合了园区管理、楼栋管理、楼层管理、房间管理以及车位管理等…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【明文导入密钥(ArkTS)】

明文导入密钥(ArkTS) 分别以导入AES256与RSA2048密钥为例,具体的场景介绍及支持的算法规格 开发步骤 指定密钥别名keyAlias。 密钥别名的最大长度为64字节。 封装密钥属性集和密钥材料。 密钥属性集同样与密钥生成中指定的密钥属性一致,须包含[HuksKe…

比较链表和数组在数据结构中的优缺点和适用场景。

在数据结构中,链表(Linked List)和数组(Array)是两种基础且广泛使用的数据结构,它们各有其独特的优缺点,适用于不同的场景。下面从技术难点、面试官关注点、回答吸引力及代码举例四个方面详细阐…

昇思MindSpore学习总结十——ResNet50迁移学习

1、迁移学习 (抄自CS231n Convolutional Neural Networks for Visual Recognition) 在实践中,很少有人从头开始训练整个卷积网络(使用随机初始化),因为拥有足够大小的数据集相对罕见。相反,通常…

Apache Seata透过源码解决SeataAT模式整合Mybatis-Plus失去MP特性的问题

本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 Apache Seata透过源码解决SeataAT模式整合Mybatis-Plus失去MP特性的问题 透过源码解决SeataAT…

【机器学习】机器学习与时间序列分析的融合应用与性能优化新探索

文章目录 引言第一章:机器学习在时间序列分析中的应用1.1 数据预处理1.1.1 数据清洗1.1.2 数据归一化1.1.3 数据增强 1.2 模型选择1.2.1 自回归模型1.2.2 移动平均模型1.2.3 长短期记忆网络1.2.4 卷积神经网络 1.3 模型训练1.3.1 梯度下降1.3.2 随机梯度下降1.3.3 A…

SpringCloud学习Day7:Seata

概念 Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务 工作流程 TC以Seata服务器形式独立部署,TM和RM则是以Seata Client的形式集成在微服务中运行

1958.检查操作是否合法

解题思路 思路是对的,是否存在好线段,则需要从给定节点的8个方向出发,然后寻找是否存在。 方向的问题,则构建行列下标变化量, C 注意在某个方向上的检查函数,可用step进行判断是否是当前节点的下一个节点…

关于同居关系析产纠纷相关裁判规则

1.同居期间双方共同所得的收入和购置的财产,按一般共有财产处理;同居期间为共同生产生活而形成的债权、债务,按共同债权、债务处理——王某某诉张某某同居关系析产纠纷案案例要旨:未办理结婚登记而以夫妻名义同居生活的&#xff0…

240707_昇思学习打卡-Day19-基于MindSpore通过GPT实现情感分类

240707_昇思学习打卡-Day19-基于MindSpore通过GPT实现情感分类 今天基于GPT实现一个情感分类的功能,假设已经安装好了MindSpore环境。 # 该案例在 mindnlp 0.3.1 版本完成适配,如果发现案例跑不通,可以指定mindnlp版本,执行!pip…

Mysql数据库索引、事务相关知识

索引 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引, 并指定索引的类型,各类索引有各自的数据结构实现 查看索引 show index from 表名;创建索引对于非主键、非唯一约束、非外键的字段&#…

基于贝叶斯优化的卷积神经网络-循环神经网络混合模型的的模拟股票时间序列预测(MATLAB R2021B)

将机器学习和深度学习方法运用到股市分析中, 不仅具有一定的理论价值, 也具有一定的实践价值。从理论价值上讲, 中国的量化投资技术(投资观念、方法与决策等)还不够成熟, 尚处在起步阶段, 能够将量化投资技术运用到投资决策中的公司寥寥无几。目前, 国内…

Spring框架:核心概念与Spring Boot微服务开发指南

引言 Spring框架是一个开源的Java平台,它提供了全面的基础设施支持,用于开发Java应用程序。Spring的核心概念包括依赖注入(DI)、面向切面编程(AOP)和事务管理。随着微服务架构的兴起,Spring Boot作为Spring框架的扩展,提供了一种快速开发独立微服务的方式。本文将详细介…

端口被占用,使用小黑框查杀

netstat -ano (查看目前所有被占的端口) netstat -ano|findstr " 8080" 查一下目前被占用的端口号 ,目前我要查的端口号是:8080,注意 后面打8080的时候,要有空格,要不然报错 **task…

Zabbix 的部署和自定义监控内容

前言 一个完整的项目的业务架构包括 客户端 -> 防火墙 -> 负载均衡层(四层、七层 LVS/HAProxy/nginx) -> Web缓存/应用层(nginx、tomcat) -> 业务逻辑层(php/java动态应用服务) -> 数据缓存/持久层(r…

C 预处理器

C 预处理器 概述 C预处理器是C语言编译过程中的一个重要环节,它对源代码进行预处理,以扩展和修改代码内容。预处理器的主要功能包括宏定义、文件包含、条件编译等。本文将详细介绍C预处理器的工作原理、功能及其在C编程中的应用。 C预处理器的工作原理…

C# List、LinkedList、Dictionary性能对比

数据结构性能对比 List、LinkedList、Dictionary 1. ArrayList (List:前传) ArrayList 是一个特殊数组, 通过添加和删除元素就可以动态改变数组的长度。 ArrayList集合相对于数组的优点: 支持…