【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://xiahunao.cn/news/3280633.html

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

相关文章

HarmonyOs~应用程序框架进阶之 UIAbility组件间的交互

我们要知道一个概念 一个应用可以有多个模块 每个模块又可以有多个UIAbility 每个UIAbility又可以有多个页面 如何创建同模块的UIAbility 首先我们创建好项目之后 就是有一个UIAbility组件存在的 那么如果我想要在同模块创建一个UIAbility怎么创建 想要创建的模块-->&g…

IP地址https证书的优势与申请途径

一、IP地址SSL证书的优势 无需域名:对于一些内部系统或者专用设备而言,它们可能不具有域名,但仍需保障通信安全。IP地址SSL证书正好满足这一需求。简化管理:对于拥有大量设备的企业来说,维护每个设备的域名可能是一个…

快手文生图模型-Kolors快速上手

Kolors是什么 可图(Kolors):用于真实感文本到图像合成的扩散模型的有效训练 可图,是快手开源的一个文生图模型,架构上使用了chatglm,比普通的sd模型在中文理解上要强大很多,以往sd模型的提示词理解能力往往只有两种 …

U盘格式化后数据能恢复吗?恢复方法盘点!

在数字化时代,U盘已成为我们日常生活和工作中不可或缺的数据存储设备。然而,在使用过程中,我们有时可能会因为各种原因对U盘进行格式化,从而不慎删除了重要数据。那么,U盘格式化后数据能恢复吗? 首先&…

判断IP是否高匿?教你小妙招!

如何判断一个IP是否是高匿的呢?小编为大家整理了一下,赶快来看一看吧! 1. 了解高匿IP的定义 高匿IP,也叫匿名代理IP,是指在使用代理IP时,不向目标服务器透露用户的真实IP地址,甚至不会透露正在…

手摸手教你撕碎西门子S7通讯协议12--使用第3方通讯库读写数据

1、概述 前面通过坚强的努力,实现了多种数据类型的读写,发现还是灰常棒的,但也显示了它的不灵活性,伙伴们肯定有很多疑问,比如如何做到一个简单的命令实现读写,而不是自己拼接那些非常复杂的报文&#xff…

在 Elasticsearch 中实现采集自动扩展

作者:来自 Elastic Pooya Salehi, Henning Andersen, Francisco Fernndez Castao 正确调整 Elasticsearch 集群的大小并不容易。集群的最佳大小取决于集群正在经历的工作负载,而工作负载可能会随着时间的推移而变化。自动扩展会自动调整集群大小以适应工…

【建议收藏】大数据Hadoop实战入门手册,配套B站视频教程1小时速通

大数据Hadoop入门实战专栏 大数据技术概述大数据简介Hadoop简介 大数据集群环境搭建环境搭建概述虚拟机准备集群搭建Java开发环境准备 分布式文件系统HDFS学习前期概述HDFS Shell命令HDFS可视化界面HDFS Java API编程环境初始化API基本使用创建目录更改目录权限上传文件查看目录…

新版HAP应用市场即将推出,诚邀意向开发者提前入驻,抢占先机

新版HAP应用市场简介 今年Q4,明道云HAP将会发布全新的应用市场。任何企业和个人,无论是明道云客户、伙伴,甚至是自由职业者,都可以入驻成为应用市场的开发者,上传独创的应用、插件、API,自由定价售卖并获得…

数说故事 | 社媒聆听“顶流”红山动物园UGC声量

7月,CASETiFY和南京红山森林动物园联名啦,一个号称“手机壳中的爱马仕”,一个是“动物园顶流”,两大IP梦幻联动,推出了“明星动物”系列手机壳,CASETiFY还解锁“饲养员”身份,认养了酷酷的美洲豹…

深度学习Day-27:生成对抗网络(GAN)入门

🍨 本文为:[🔗365天深度学习训练营] 中的学习记录博客 🍖 原作者:[K同学啊 | 接辅导、项目定制] 要求: 了解什么是生成对抗网络生成对抗网络结构是怎么样的学习本文代码,并跑通代码调用训练好…

抖音开放平台API接口如何开发||抖音相关接口数据采集数据分析 【附实例】

抖音开放平台提供了多种接口,包括授权登录、用户信息、视频管理、评论互动、消息通知、数据分析等。 以下是开发抖音接口的一些步骤: 1. 注册开发者账号:在抖音开放平台上注册开发者账号,获取开发者身份认证。 2. 创建应用&…

Oracle VM VirtualBox 异常退出,如何解决??

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

【Linux】进程间通信 —— 管道与 System V 版本通信方式

目录 为什么有进程间通信?进程间通信的目的是什么? 管道 匿名管道 父子进程共享管道 命名管道 共享内存 概念 原理 共享内存和内存映射(文件映射)的区别 使用 消息队列 概念 使用 信号量 概念 使用 IPCS 命令 S…

Docker Compose方式部署Ruoyi-前后端分离版本

目录 一. 环境准备 二. 制作一个jdk8u202环境的镜像 三. 制作nginx镜像 四. 对项目文件做修改 五. 项目打包 1. 前端打包 2. 后端打包 六. 编写docker-compose.yml 一. 环境准备 主机名IP系统软件版本配置信息localhost192.168.226.25Rocky_linux9.4 git version 2.…

码农职场:一本专为IT行业求职者量身定制的指南

目录 写在前面 推荐图书 推荐理由 写在后面 写在前面 本期博主给大家推荐一本专为IT行业求职者量身定制的指南:《码农职场》。 推荐图书 https://item.jd.com/14716160.html 内容简介 这是一本专为广大IT 行业求职者量身定制的指南,提供了从职前…

黑马JavaWeb后端案例开发(包含所有知识点!!!)

目录 1.准备工作 环境搭建 开发规范 REST(REpresentation State Transfer),表述性状态转换,它是一种软件架构风格 注意事项 统一响应结果 2.部门管理功能 查询部门 删除部门 新增部门 RequestMapping 3.员工管理功能 分页查询 批…

单细胞|MEBOCOST·基于代谢物的细胞通讯预测(一)

import os,sys import scanpy as sc import pandas as pd import numpy as np from matplotlib import pyplot as plt import seaborn as sns from mebocost import mebocost 1. 创建 mebocost 对象 adata sc.read_h5ad(data/demo/raw_scRNA/demo_HNSC_200cell.h5ad) ## che…

开发无人带货直播插件

在当今快速发展的电商行业中,直播带货已成为推动销售增长的重要力量,然而,随着直播市场的日益饱和和消费者需求的不断变化,如何在保持直播互动性的同时,实现高效、低成本的运营成为许多商家关注的焦点。 无人带货直播…

springboot 微信消息推送 springboot sse推送

目录 一、springboot 微信消息推送 springboot sse推送 1、在 Spring 框架中实现 2、传统的 Servlet 中实现 一、springboot 微信消息推送 springboot sse推送 关于 SSE SSE 全程 Server Send Event,是 HTTP 协议中的一种,Content-Type 为 text/event…