如何避免死锁,我们有什么套路可循?
点击蓝色“程序猿DD”关注我
回复“资源”获取独家整理的学习资料!
单纯的用 synchronized 方法起不到保护作用(不能保护 target)
用 Account.class 锁方案,锁的粒度又过大,导致涉及到账户的所有操作(取款,转账,修改密码等)都会变成串行操作
如何解决这两个问题呢?咱们先换好衣服穿越回到过去寻找一下钱庄,一起透过现象看本质,dengdeng deng.......
来到钱庄,告诉柜员你要给铁蛋儿转 100 铜钱,这时柜员转身在墙上寻找你和铁蛋儿的账本,此时柜员可能面临三种情况:
理想状态: 你和铁蛋儿的账本都是空闲状态,一起拿回来,在你的账本上减 100 铜钱,在铁蛋儿账本上加 100 铜钱,柜员转身将账本挂回到墙上,完成你的业务
尴尬状态: 你的账本在,铁蛋儿的账本被其他柜员拿出去给别人转账,你要等待其他柜员把铁蛋儿的账本归还
抓狂状态: 你的账本不在,铁蛋儿的账本也不在,你只能等待两个账本都归还
放慢柜员的取账本操作,他一定是先拿到你的账本,然后再去拿铁蛋儿的账本,两个账本都拿到(理想状态)之后才能完成转账,用程序模型来描述一下这个拿取账本的过程:
我们继续用程序代码描述一下上面这个模型:
class Account { private int balance; // 转账 void transfer(Account target, int amt){ // 锁定转出账户 synchronized(this) { // 锁定转入账户 synchronized(target) { if (this.balance > amt) { this.balance -= amt; target.balance += amt; } } } }
}
这个解决方案看起来很完美,解决了文章开头说的两个问题,但真是这样吗?
我们刚刚说过的理想状态是钱庄只有一个柜员(既单线程)。随着钱庄规模变大,墙上早已挂了非常多个账本,钱庄为了应对繁忙的业务,开通了多个窗口,此时有多个柜员(多线程)处理钱庄业务。
柜员 1 正在办理给铁蛋儿转账的业务,但只拿到了你的账本;柜员 2 正在办理铁蛋儿给你转账的业务,但只拿到了铁蛋儿的账本,此时双方出现了尴尬状态,两位柜员都在等待对方归还账本为当前客户办理转账业务。
现实中柜员会沟通,喊出一嗓子 老铁,铁蛋儿的账本先给我用一下,用完还给你,但程序却没这么智能,synchronized 内置锁非常执着,它会告诉你「死等」的道理,最终出现死锁
Java 有了 synchronized 内置锁,还发明了显示锁 Lock,是不是就为了治一治 synchronized 「死等」的执着呢?
如何避免死锁,我们有什么套路可循?相关推荐
- 海有舟可渡、山有路可循 —— 大学四年圆满落幕
⛺️前言 仅以此篇文章记录我的大学四年! 回忆大学四年,有惊喜.有快乐.有崩溃.有欢呼: 有过无数个为了赶策划.赶ddl的熬夜,更有凌晨2点做志愿活动.凌晨5点赶项目的通宵达旦. 梳理下大学四年的大事 ...
- 网络游戏服务器架构设计
有一天,我突然不想做游戏了.于是写点开发总结,于是就有了这篇文档. 入手 假如,我现在接手一个新项目,我的身份还是主程序.在下属人员一一到位之前,在和制作人以及主策划充分沟通后,我需要先独自思考以下问 ...
- 如何做一名主程之Unity3D网络游戏服务器架构设计
下面我们开始今天的Unity3D游戏开发技能. 初期学习目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发. 今天给大家讲一下如何做一个好 ...
- Unity3D游戏开发之网络游戏服务器架构设计培训
下面我们开始今天的Unity3D游戏开发技能培训. 我们专业培养"游戏主程",挑战20W年薪,初期学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改 ...
- 技改之路:从单块应用到微服务,我的血泪总结--转
原文地址:http://chuansong.me/n/346948051463 技改是技术改造的简称,是技术的蜕变.本文指的是在公司技术发展的某个瓶颈阶段,按原有开发和组织方式已经无法玩下去,这时公司 ...
- [系统安全] 三十一.恶意代码检测(1)恶意代码攻击溯源及恶意样本分析
您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...
- 奈飞文化手册_奈飞文化手册学习笔记
<奈飞文化手册>,这是由流媒体巨头奈飞的前CHO(人才官),奈飞文化平台的创建者帕蒂·麦考德所著,这是一本彻底颠覆了20世纪管人理念的书. 奈飞的企业文化,和我们常见的任何一种企业都不一样 ...
- 互联网公司还要亏多久?
作者 | 黎明 本文经授权转载自燃财经(ID:rancaijing) 在互联网行业,创办一家上市公司可能只需要三年,但创办一家盈利的公司,可能需要五年甚至更长时间. 网易.新浪.搜狐,这批20年前兴起 ...
- 计算机视觉专硕:OCR、实习和秋招
向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程 公众号:datayx 智能票据录入系统 项目展示 真的是光阴似箭,好像昨天还沉浸在考研成功的喜悦,今天却要即将步入2 ...
最新文章
- Waymo无人卡车高调重返凤凰城,但货运先机已失
- 在普通Java类里使用spring里注入的service、dao等
- 是否有一个不区分大小写的string.Replace的替代方法?
- 解决eclipse修改后台代码ctrl+s总是【自动重启服务器】问题
- QEventLoop的简单使用(二)
- 数据库基础知识——MySQL服务的启动和停止
- 从0开始搭建公司后台技术栈,这套架构值得拥有...
- 一、K3 WISE 实施顾问教程《进度1-谈谈实施顾问》
- 17.XML 命名空间(XML Namespaces)
- canvas设置字体粗细用数字没效果_干货 | 用uni-app制作迷你PS小程序
- 国内常用的5个中文期刊论文网站,5个外文文献网站
- tinder和bumble_发布课程:Tinder,Reddit,Airbnb,Etsy和Uber如何吸引了第一批用户
- LAIC2022司法人工智能挑战赛 - 司法文本小样本多任务Baseline
- ExpRe[10] Ubuntu[2] 准备神秘软件、备份恢复软件
- 阿里聚石塔限制IP 过部署服务器详细流程
- 15微型计算机系统不包括,全国2002年10月自学考试计算机应用基础真题
- 计算网路地址,广播地址,第一位和最后一位可用地址,可用的IP地址
- 俄油与中石油达成为期10年的协议;苏伊士完成股东联合体收购,苏冰岚履职首席执行官 | 能动...
- 解决Word中无法使用Mathtype
- 核心微生物分析_科学网—微生物组核心OTU鉴定usearch otutab_core - 刘永鑫的博文...
热门文章
- linux shell 删除两个文件相同部分
- docker-compose up volumes 调用外部文件,权限问题 cannot open directory xxxxx .: Permission denied
- python 字符串前面加u,r,b,f的含义
- python uvloop异步框架简介
- linux查看网卡速率
- VC 中字符串比较和查找
- Android系统的架构
- f2 自适应_典型的三行二列居中高度自适应布局
- 算法 - 选择排序(C#)
- mysql分区字段创建索引_MySQL分区字段列有必要再单独建索引吗?