【JavaSE-线程安全问题-死锁详解】

🌈个人主页:努力学编程’
个人推荐
c语言从初阶到进阶
JavaEE详解
数据结构
学好数据结构,刷题刻不容缓:点击一起刷题
🌙心灵鸡汤总有人要赢,为什么不能是我呢
在这里插入图片描述

在这里插入图片描述

🌈🌈🌈死锁的概念

对于线程安全问题,我们在上一篇文章中已经提到了一些情况,比如由于多个线程针对同一个变量修改,即类似于count++的操作,可能会由于多线程抢占式执行的特性导致count的值发生异常,其实除了这种情况之外,线程安全仍有很多我们需要注意的操作,比较典型的就是死锁

🌈🌈🌈实例死锁场景

那么到底什么事死锁呢,我们直到在上述我们提到的线程安全问题中我们解决的方法之一就是可以将count++这些操作使用synchronized关键字来使用锁将其封装起来,这就构成了锁而如果你在锁的内部,又加了一重锁,那么就可能会导致死锁,

public static Object locker=new Object();public static void main(String[] args) {Thread t1=new Thread(()->{synchronized (locker){synchronized (locker){System.out.println("hello Thread");}}});t1.start();}

在这里插入图片描述

此时线程的代码执行到锁1后,由于锁的互斥性,这里锁2就无法抢占到锁,必须等到锁1执行完毕之后,才能有机会抢占到锁,但是要想锁1释放锁,就要执行完其中的所有代码,但是代码显然在锁2处阻塞了,此时就会出现死锁问题了.
幸运的是我们运行这段代码是可以正常打印的,这是为什么呢,原来是因为,在java内部对这个死锁的状况做了一定的优化,简单来说,就是程序员大概率会写出这样的代码,为了能提高代码的执行效率,java就会对其做出判断,当前锁对象是否已经在外部使用过,使用过h会将内部锁失效,正常执行代码.

在这里插入图片描述

🌈🌈🌈死锁场景2-多个线程多把锁

假如我们现在有两个线程,两把锁,那么此时当线程1在不释放锁1的时候,同时针对锁2加锁,线程2在不释放锁2的情况下,针对锁1加锁,那么此时就会导致死锁的发生.

public class Test {public static Object locker1=new Object();public static Object locker2=new Object();public static void main(String[] args) {Thread t1=new Thread(()->{synchronized (locker1){try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}synchronized (locker2){System.out.println("hello Thread1");}}});Thread t2=new Thread(()->{synchronized (locker2){try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}synchronized (locker1){System.out.println("hello Thread2");}}});t1.start();t2.start();}}

运行结果:

在这里插入图片描述
过程分析:

这里线程1,线程2都有可能会抢到先执行的状况,所以我们对两个线程都加sleep操作,这样就会保证两个线程都能抢到一把最外边的锁规避一个线程将两把锁都抢占的情况.实现上述的场景

此时线程1要想继续执行代码就要等到线程2释放锁2之后,才可以抢占锁2继续执行后序的代码,而对于线程2来说,要想继续执行后序的代码,就要等线程1释放锁1之后,才能针对锁1加锁然后继续完成后续的操作.所以此时就会陷入一个僵持的场面,进而导致程序陷入持续等待的场景,这也是死锁的场景,并且此时Java也无法对其作出优化操作.

在这里插入图片描述

🌈🌈🌈哲学家问题引起的死锁问题

在古代西欧时就提出了一个非常有意思的问题,哲学界问题,是这样的,一共有五个哲学家,坐在同一个桌子上吃饭,每个人的跟前都有一根筷子和一碗饭,对于哲学家来说他们一共做两件事一:吃饭,二:思考人生,如果大家同时思考人生,后面如果大家都要开始同时吃饭那么就会出现每个人都拿着一根筷子无法正常进食.

在这里插入图片描述

其实这个场景就很好的演示了关于死锁的最后一个典型案例,即一共有m把锁,n个线程,此时就可能出现上述的案例,那么如何解决这个死锁的情况呢.

这里采取的措施是这样的,我们给每一根筷子从小到大都标号,让每个哲学家都必须拿到再它面前最小标号的筷子.此时就会出现如下场景.

在这里插入图片描述
好的,此时按照我们的要求每个人必须要先拿到自己面前最小编号的筷子,所以此时就会导致最上面的人不能拿到筷子,那么此时最左边的人就会接着拿到5号筷子,吃饭,吃完后放下筷子,离开接着是左下方人又拿着4号筷子开始吃饭,吃完离开,以此类推,所有人都可以吃到饭了.

对应到线程中也是一样的,我们可以将所有的锁进行标号,并且每次让线程拿锁按照一定的顺序,这样就会巧妙的避开当前所说的死锁问题,这里就给大家说到这里.这里关于死锁可能还有一个话题就是银行家算法,这个确实是解决死锁的一种方法,但是由于实现该算法的代码很复杂,语法较难,所以我们日常开发中是不用这种算法的,大家感兴趣的话可以自己去网上看看.

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

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

相关文章

医疗器械网络安全 | 第三方组件安全检测怎么做?

医疗器械软件安全中的第三方组件安全检测是确保医疗器械软件整体安全性的重要环节。以下是如何进行第三方组件安全检测的详细步骤: 一、明确检测目标 首先,需要明确检测的目标和范围,即确定哪些第三方组件需要进行安全检测。这通常包括操作系…

【C#】 使用GDI+获取两个多边形区域相交、非相交区域

一、使用GDI获取两个多边形区域相交、非相交区域 在 C# 中使用 GDI(Graphics Device Interface Plus)处理图形时,你可以使用 System.Drawing 和 System.Drawing.Drawing2D 命名空间中的类来操作区域(Region)。下面是一…

JS中如何对数组或者数组对象中所有的元素进行快速判断(every、some)

every是判断数组中所有元素均满足某个条件,some是判断数组中任意一个元素满足条件 举个栗子: const arr1 [{name:谭,},{name:谭},{name:高}]; const arr2 [{name:谭,},{name:谭},{name:谭}];const result1 arr1.every(item > item.name 谭);cons…

7月29(信息差)

🌍最强模型 Llama 3.1 如期而至!扎克伯格最新访谈:Llama 会成为 AI 界的 Linux 🎄谷歌AlphaProof攻克国际奥赛数学题 https://www.51cto.com/article/793632.html ✨SearchGPT第一波评测来了!响应速度超快还没广告&…

基于bert的自动对对联系统

目录 概述 演示效果 核心逻辑 使用方式 1.裁剪数据集 根据自己的需要选择 2.用couplet数据集训练模型 模型存储在model文件夹中 3.将模型转换为ONNX格式 4.打开index.html就可以在前端使用此自动对对联系统了。 本文所涉及所有资源均在传知代码平台可获取。 概述 这个生成器利用…

学习c语言第十八天(指针笔试题)

一维数组 字符数组 char*p"abcdef" p里面放的是a元素的地址 二维数组 指针笔试题 第一题 2 5 第二题 第三题 第四题 第五题 第六题 10 5 第七题 at 第八题 POINT ER ST EW

迪文屏使用记录

项目中要使用到迪文屏,奈何该屏资料太琐碎,找的人头皮发麻,遂进行相关整理。 屏幕:2.4寸电容屏 型号:DWG32240C024_03WTC 软件:DGUS_V7.647 1.竖屏横显 打开软件左下方的配置文件生成工具&#…

AI绘画【stable diffusion 1.5 Lora模型】摄影级真人写真,逼真大片!唯美!看完被震撼了!

前言 今天是鲜花摄像方面推荐的第四款SD 1.5 Lora模型,也是近日鲜花方面最后一款推荐的模型——**NAL_花海与车_摄影系列。**该款模型灵感来自于一张坐在车里的艺术照,lora主要作用于添加了花植物之类的填充效果,还有车内的坐姿,…

网络安全等级保护:上下文中的API安全性

网络安全等级保护:什么是API安全? 上下文中的API安全性 应用程序编程接口安全性位于多个安全学科的交叉点,如图所示。其中最重要的是以下三个领域: 1.信息安全(InfoSec)涉及在信息的整个生命周期中保护信…

智能城市管理系统设计思路详解:集成InfluxDB、Grafana和MQTTx协议(代码示例)

引言 随着城市化进程的加快,城市管理面临越来越多的挑战。智能城市管理系统的出现,为城市的基础设施管理、资源优化和数据分析提供了现代化的解决方案。本文将详细介绍一个基于开源技术的智能城市管理系统,涵盖系统功能、技术实现、环境搭建…

【C++】选择结构- 嵌套if语句

嵌套if语句的语法格式&#xff1a; if(条件1) { if(条件1满足后判断是否满足此条件) {条件2满足后执行的操作} else {条件2不满足执行的操作} } 下面是一个实例 #include<iostream> using namespace std;int main4() {/*提示用户输入一个高考分数&#xff0c;根据分…

市面上的开放式耳机为什么很少?开放式耳机推荐分享

市面上开放式耳机少是有不少原因的。 首先&#xff0c;开放式耳机在隔音和防漏音方面存在挑战。对于很多用户来说&#xff0c;在公共场合使用耳机时&#xff0c;不希望声音外泄影响他人&#xff0c;也不希望外界声音过多干扰自己。而开放式耳机在这两点上较难做到平衡&#xf…

基于Spring boot + Vue的加油站系统

项目名称&#xff1a;加油站系统 作者的B站地址&#xff1a;程序员云翼的个人空间-程序员云翼个人主页-哔哩哔哩视频 csdn地址&#xff1a;程序员云翼-CSDN博客 1.项目技术栈&#xff1a; 前后端分离的项目 后端&#xff1a;Springboot MybatisPlus 前端&#xff1a;Vue…

【网络协议】HTTP协议详解

文章目录 一、概念 二、简史 三、特点 四、工作流程 五、使用Wireshark抓TCP、http包 六、头域 6.1、请求信息&#xff1a; 6.2、请求方法 6.3、响应消息 6.4、响应头域 6.5、HTTP常见的请求头 6.6、HTTP常见的响应头 七、解决HTTP无状态的问题 7.1、通过Cookies保存状态信息 7…

Redis 缓存中间件

目录 概念 安装redis redis基本命令 给redis添加密码 基础数据类型 string类型 list列表类型 set创建&#xff08;一个键对应一个值&#xff09; set 创建数据 get 获取数据 keys * 展示所有的键 exists 判断键值是否存在 type 查看数据的类型 del 删除键 rename…

springboot集团门户网站--论文源码调试讲解

第2章 开发环境与技术 开发集团门户网站需要搭建编程的环境&#xff0c;也需要通过调查&#xff0c;对各个相关技术进行分析&#xff0c;选取适合本系统开发的技术与工具。 2.1 MySQL数据库 MySQL是一种具有安全系数、安全系数、混合开发性、高效化等特征的轻量关联数据库智…

sqli-labs(6-10)关通关讲解

sqli-labs(6-10)关通关讲解 Less-6 方法一&#xff1a;手工注入 1.判断闭合 http://localhost/sqli-labs/Less-6/?id1" //报错 http://localhost/sqli-labs/Less-6/?id1" -- //正常 http://localhost/sqli-labs/Less-6/?id1" and 11 -- http://localhos…

Python批量移除Word文档水印

Word文档被广泛用于各种正式与非正式的沟通场合。有时候这些文档中可能包含着不再需要的水印&#xff0c;比如早期的草稿标记、保密声明或是仅供预览的信息等。这些水印的存在可能会干扰文档的阅读体验&#xff0c;甚至在某些情况下导致信息传达的不准确或产生误解。移除Word文…

Canva收购Leonardo.ai,增强生成式AI技术能力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

数据中台建设之数据汇聚与数据交换

目录 一、数据汇聚 1.1 概述 1.2 汇聚数据类型 1.2.1 结构化数据 1.2.2 半结构化数据 1.2.3 非结构化数据 1.3 汇聚数据模式 1.3.1 概述 1.3.2 离线 1.3.3 实时 1.4 汇聚数据方法 1.4.1 概述 1.4.2 ETL 1.4.3 ELT 1.5 汇聚数据工具 1.5.1 概述 1.5.2 Flink CDC…