对一个死锁问题的思考

Cartographer从安装到实战:手把手教你运行2D/3D建图与定位 本文提供了一份详尽的Cartographer从零安装到实战应用的完整指南。内容涵盖环境准备、依赖编译、源码构建等关键步骤,并手把手指导读者运行2D/3D官方数据集进行建图与定位测试。文章深入解析了参数配置与自定义数据适配方法,帮助开发者快速掌握这一强大的实时同步定位与建图工具,并将其应用于机器人导航与自动驾驶等实际场景。 阅读详情

前些天周杰让我看了一段代码, 让我觉得学习一下基础的知识还是挺重要的, 对理解代码有很大帮助。

这是一个关于死锁的问题,代码如下:

0?wx_fmt=jpeg

很明显,这段代码在多线程情况下,会产生死锁:

假设线程1 做的操作是账户A给账户B转账, 先锁住了A账户, 接下来试图申请B账户的锁,

与此同时线程2 在从 账户B给账户A 转账, 先锁住了B账户的锁, 接下来试图申请A账户的锁。

两个线程各自持有资源, 然后等待获取对方的资源, 都无法执行下去, 死锁就出现了。

怎么写代码才能避免这种死锁呢?下面的代码是一种解决办法:

0?wx_fmt=jpeg

这段代码看起来有点吃力,但是如果你学过操作系统对死锁的处理的话, 就变的很容易。

操作系统中的理论是这样的: 如果有多个线程对多个资源进行访问时, 需要对资源进行排序(排序的方法你自己确定), 然后所有的线程都按同样的次序来访问资源,这样就不会出现环路等待了。

例如有10个线程, 每个都要访问多个资源, 对资源排序以后, 大家都先锁住1号资源进行访问(注意同一时刻,只有一个线程能获得锁, 别的都得等待) 然后是2号, 3号。。。

由于大家访问的次序是一样的, 就不会出现死锁的的情况。

理解了这一点, 对于上面的代码就很容易理解了, 实际就是对Account(账户)进行资源的排序, 通过 Java 内置的方法,得到Hashcode。 然后按顺序访问。

如果fromAccount 比较小, 那就先锁住fromAccount, 然后锁住toAccount, 反过来也是类似。

假设线程1 做的操作是账户A给账户B转账, 先锁住了A账户(假设A的hashcode 比较小), 接下来试图申请B账户的锁,

与此同时线程2 在从 账户B给账户A 转账, 由于A的hashcode 较小, 这个线程也试图先申请A的锁, 当然它申请不到, 因为已经被线程1持有了, 线程2只能等待

等到线程1完成操作以后, 线程2才能继续, 死锁就消除了。

如果两个账号的hashCode 相等怎么办, 没办法,只好引用一个第三方的锁了解决了, 这就是上述代码的else 分支 synchronized(lock) .

所以你看, 那些基础的理论还是挺重要的,的确是前辈们总结出来的精华, 学会了以后, 你看问题的角度和眼界就不同了。

-------------------------------------------------------------------------------------------------------------

关于码农翻身公共号(coderising) : 由工作15年的IBM架构师刘欣创建,致力于帮助在校学生和刚工作的同学提高编程水平,多年的工作经验,肯定能让你少走弯路。


加入码农翻身QQ群:135769418 带着你做项目实战, 可是真的项目需求哦,涉及大量Android,iOS, Web开发的技术, 同学们做完后参加工作,技术上就不用愁了。

长按二维码, 关注"coderising"

0?wx_fmt=jpeg

【生信分析】clusterProfiler: universal enrichment tool for functional and comparative study(1) clusterProfiler: universal enrichment tool for functional and comparative studyClusterProfiler: 用于功能和比较研究的通用富集工具总览1. 引言1.1 术语1.1.1 基因集和通路1.1.2 基因同源(GO)1.1.3 京都基因与基因组百科全书(KEGG)1.1.4 其他基因集2. 功能富集分析方法2.1 过度表征分析(Over Representation Analysis)2.2 基因集富集分析(Gene Se 阅读详情

相关推荐

常见消息队列:ActiveMQ、RabbitMQ、RocketMQ、Kafka的区别总结

常见消息队列:ActiveMQ、RabbitMQ、RocketMQ、Kafka的区别。

qq_30713721的博客 3472

死锁详解和解决办法

死锁概念 死锁是指两个以上线程因争夺资源而发生互相等待的现象!没有外力调解的话,就造成线程一直互相等待,无法执行的情况! 死锁发生的必要条件 死锁发生会同时出现以下的四个必要条件。 1、互斥 一个资源同时只能被一个线程使用 2、请求并保持 线程在请求资源阻塞的时候,并不会释放其已经拥有的资源。 3、不可剥夺 对于线程已经获得的资源,只能线程自己释放,其他线程无法强制剥夺。 4、循环等待 两个或者两个以上线程出现等待资源出现循环依赖。 死锁的解决方法 死锁共有三种解决方式: 1、预防死锁 预防死锁的解决方法就

qq_40276626的博客 1万+

Python爬虫实战:5分钟搞定东方财富网股票数据抓取(附完整代码)

本文详细介绍了如何使用Python爬虫快速抓取东方财富网的股票数据,包括环境配置、API分析、核心代码实现及优化技巧。通过简单的requests和pandas库,5分钟内即可获取高质量股票数据,适合量化交易和数据分析初学者。

weixin_29040367的博客 1187

码农翻身 各章节链接

大话编程 我是一个线程 我是一个Java class Javascript: 一个屌丝的逆袭 Java:一个帝国的诞生 JSP:一个装配工的没落 TCP/IP 之 大明王朝的邮差 TCP/IP 之 大明内阁 TCP/IP 之 蓟辽督师 CPU 阿甘 CPU 阿甘之烦恼 CPU 阿甘:函数调用的秘密 我是一个网卡 我是一个路由器 我是一个进程 我是一块硬盘(上) 我是...

wudinaniya的博客 4万+

01-嵌入式入门-如何看原理图

最近由于找到的工作是偏于嵌入式方向,因此又重新开始学习已经丢弃两年的知识。新手学习知识感觉有一个通病:喜欢收集各种各样的视频、资料,网盘里收藏一大堆,但是却从没有打开看过,到头来还是个小白,只听说过几个概念,而实际却是不知所云,这就是所谓的"学习综合征"。而我也是其中的一员,最近痛定思痛,就准备根据一套资料沉下心学习下去,不再进入收集资料的大军。...

weixin_34010566的博客 4492

对计算机专业来说学历真的重要吗?

我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...

启舰 55万+

线程,锁的概念——码农翻身读后感

基础了解    1. 单CPU中进程只能是并发,多CPU计算机中进程可以并行。    2. 单CPU单核中线程只能并发,单CPU多核中线程可以并行。    3. 无论是并发还是并行,使用者来看,看到的是多进程,多线程。 串行、并发、并行     1. 串行      多个任务执行时,一个任务执行完再执行另一个任务     2. 并发      多个线程在单个核心运行,同一时间一个线程运行,系统不停...

我没灵感了-_-的博客 334

利用VBA宏实现LightTools仿真数据自动化导出至Excel

本文详细介绍了如何利用VBA宏实现LightTools仿真数据自动化导出至Excel的完整流程。通过调用LTAPI接口,工程师可以自动执行仿真、抓取照度与光强等数值数据、捕获并粘贴仿真图像,从而将重复性工作自动化,显著提升光学设计工作的效率和准确性。

weixin_28314575的博客 503

什么是死锁?自己动手写死锁。一个死锁的例子。死锁的四个条件,如何避免死锁。

文章目录一、什么是死锁二、动手写死锁三、发现排查死锁情况四、解决办法 面试题就好像计算机二级一样扯淡的出一些并不常见的题目(甚至写法很反人类),我们就借此锻炼一下逻辑能力把。 一、什么是死锁 死锁不仅在个人学习中,甚至在开发中也并不常见。但是一旦出现死锁,后果将非常严重。 首先什么是死锁呢?打个比方,就好像有两个人打架,互相限制住了(锁住,抱住)彼此一样,互相动弹不得,而且互相欧气,你不松手我就不...

白衣 5606

【赛题解析&命令脚本配置】2023年全国职业院校技能大赛GZ073网络系统管理赛项赛题第9套模块A:网络构建 & (三)无线网络配置+(四)出口网络配置-命令配置

【赛题解析&命令脚本配置】2023年全国职业院校技能大赛GZ073网络系统管理赛项赛题第9套模块A:网络构建 & (三)无线网络配置+(四)出口网络配置-命令配置

君逍遥o 1018

各大厂薪资对比爬虫:Python采集OfferShow爆料数据

print(f"⚠️ API返回错误码: {data.get('code')}, msg: {data.get('msg')}")ax.set_title('各大厂薪资对比 (基于OfferShow爆料数据)', fontsize=16, fontweight='bold')stats.columns = ['人数', '平均年薪', '年薪中位数', '年薪标准差', '平均月薪', '平均月数']print(analyzer.get_position_stats('字节跳动').head(10))

2201_76125261的博客 606

读书笔记(一)《码农翻身》

好久都没有写技术博客了,大概有一年左右没有开始写了,原因是自己弄了一个日志博文,当然这不是重点,重点是心态发生了改变,从心里上感觉技术兴趣不大了,后来又发现,并不是对技术失去了兴趣,而是被2018年的各种变故打击掉了自信心,从M家离开以后那种自信就消失了,机缘巧合之下又来到了T家,心态上这才开始慢慢好转起来了。 今天来写一写《码农翻身》这本书的读书笔记,感觉很不错,适合技术上的深究和归纳 线程...

摩尔的博客 1297

cesium单向流动线效果

在学材质的路上一去不复返了属实是,难也难在这。还请各位大佬多多指教~

就zhei? 690

【Linux应用编程】一个异步信号处理引起死锁问题的思考

Linux信号异步处理引起的死锁问题思考,及编写安全信号回调函数的注意事项。

只要思想不滑坡,想法总比问题多。 1485

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

线上问题引发的思考---从一个死锁看mysql innodb的锁机制

美团点评实习过程中遭遇的线上数据库死锁错误引发的思考和原理讲解(该讲解为外部摘录)

bwju的专栏 707

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

MySQL 遇到的死锁问_Mysql 百问系列:死锁是怎么发生的

本文主要从共享锁(S锁)和独占锁(X锁)出发,详细说明两种锁的加锁机制,以及死锁如何产生。问题:什么是共享锁,什么是独占锁?死锁怎么发生的?发生死锁了,Mysql 如何处理的?共享锁和独占锁上一篇文章中我们已经讲解了共享锁和独占锁的基本概念,我这边再详细将一下。共享锁 Shared Locks (S 锁) 从名字就可以看出来它允许共享,共享的意思是当你给某个事物加上锁后,其他人还可以为它加上(仅...

weixin_39860108的博客 106

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

mysql update语句 死锁_mysql数据库先update后insert死锁分析

先update再insert的并发死锁问题分析。背景“如果库里有对应记录,就更新,没有就插入”很简单的一个逻辑,相信很多人都会遇到。最近看一个工程里实现代码是这样的,mysql数据库走的是默认的事务级别:可重复读。包在一个事务中执行:if update更新结果>0then return "成功";elseinsert一条新记录看起来似乎没什么问题,线上频频出现insert死锁。这里总结下,分...

weixin_39670545的博客 686

进程同步互斥——不死锁的哲学家问题

一、需求分析   (1)本程序模拟不死锁的哲学家问题,将哲学家们的活动过程以文字及可视化的方式表示出来。   (2)本程序的运行不需要输入测试数据,在程序运行是会提示选择程序的运行频率,选择运行频率后点击“开始”按钮,程序会自动模拟哲学家就餐问题,通过随机数决定哲学家的思考时间和进餐时间。点击“返回选择运行频率”可以重新选择运行的速度,点击“结束”则退出程序。   (3)程序的输出形式

E8A1F6的专栏 1640

Java中 死锁现象怎么解决_探讨Java中的死锁现象

今天搞了一下Java的死锁机制,感觉自己还是不怎么懂,所以就从一些简单的源代码中琢磨:我先尝试写了一个很简单的死锁代码:思路是线程A获得B的锁但还没有获得C的锁,所以在等待获得C的锁,还线程A1获得了C的锁但没有获得B锁所以就在等待B的锁,所以就造成了相互等待,程序陷入死锁状态……死锁程序:public class DeadLock{public static void main(String[]...

weixin_34439193的博客 213

多线程—死锁

1、死锁 出现场景:当线程A拥有了A对象的锁,想要去获取B对象的锁;线程B拥有了B对象的锁,想要拥有A对象的锁,两个线程在获取锁的时候,都不会释放已经持有的锁,于是,就造成了死锁。 示例代码: @Slf4j public class ThreadTest { private static Object objectA = new Object(); private static Object objectB = new Object(); public static void

qq_42251944的博客 427

Java 死锁面试_面试17解析-死锁

描述:在一张圆桌上,有n个哲学家,n支筷子,他们的生活方式只是交替地进行思考和进餐,饥饿时便试图取其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐,进餐完毕,放下筷子又继续思考。根据描述,实现代码如下:public class Question17 {public static void main(String[] args) {ExecutorService exec = Executor...

weixin_36393239的博客 103

哲学家就餐导致死锁(Java实现)

有五个哲学家,他们的生活方式是交替地进行思考和进餐。他们共用一张圆桌,分别坐在五张椅子上。 在圆桌上有五个碗和五支筷子,平时一个哲学家进行思考,饥饿时便试图取用其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐。进餐完毕,放下筷子又继续思考。 public class day01 { private static String s1="筷子左"; private static String s2="筷子右"; public static void main(String..

你就是根号四的博客 272

java解决动态的锁顺序死锁的方案

直接上代码 public class Test3 { public static Object fromAccount = new String("1"); public static Object toAccount = new String("2"); /*public static Object toAccount = new String("1");*/ ...

ラピスラズリ(Dawn)的笔记本 183

哲学家就餐问题 Java语言实现

1. 哲学家就餐问题描述本文部分内容来源于此,欲了解详细内容,自行点击查看。 为了不失一般性,我们假设有n个哲学家,围着餐桌思考宇宙、人生问题,每个哲学家面前有一个叉子与之对应,即:共有n个叉子;当哲学家思考一段时间后,他会拿起身边的2个叉子才能进食。进食完毕后,该哲学家放下叉子,继续思考人生、宇宙,如此往复,周而复始。 2. 解决方案 在解决该类问题时,属于竞争资源情形,假设所有哲学家均同

toseektruth的博客 2076

实验报告:哲学家就餐问题的实现

该问题是描述有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐完毕,放下筷子继续思考。如果可以取左右两边的筷子,那么哲学家从思考状态转为就餐状态。就餐结束后,哲学家放下左右两边的筷子,并从就餐状态又转为思考状态。每个哲学家若想从思考状态转为就餐状态时,先取左边的筷子,在尝试取右边的筷子。(3)在 Ubuntu 系统下编程实现哲学家就餐问题。

瑞瑞ruirui的博客 4067

哲学家就餐问题linux源代码,哲学家就餐问题代码

#include //筷子作为mutexpthread_mutex_t chopstick[6] ;void *eat_think(void *arg){char phi = *(char *)arg;int left,right; //左右筷子的编号switch (phi){case 'A':left = 5;right = 1;break;case 'B':left = 1;right = 2...

weixin_39878716的博客 260
上一篇: 圣诞礼物:Java EE的历史
下一篇: Java EE读书指南
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值