当前位置: 首页 > news >正文

05 | 一不小心就死锁了,怎么办?

第一部分:并发理论基础

05 | 一不小心就死锁了,怎么办?

文章目录

  • 第一部分:并发理论基础
    • 05 | 一不小心就死锁了,怎么办?
      • 向现实世界要答案
      • 没有免费的午餐
      • 如何预防死锁
        • 1.破坏占用且等待条件
        • 2.破坏不可抢占条件
        • 3.破坏循环等待条件
      • 总结
      • 课后思考



在上一篇文章中,我们用 Account.class 作为互斥锁,来解决银行业务里面的转账问题,虽然这个方案不存在并发问题,但是所有账户的转账操作都是串行的,例如账户 A 转账户 B、账户 C 转账户 D 这两个转账操作现实世界里是可以并行的,但是在这个方案里却被串行化了,这样的话,性能太差。

试想互联网支付盛行的当下,8 亿网民每人每天一笔交易,每天就是 8 亿笔交易;每笔交易都对应着一次转账操作,8 亿笔交易就是 8 亿次转账操作,也就是说平均到每秒就是近 1 万次转账操作,若所有的转账操作都串行,性能完全不能接受。

那下面我们就尝试着把性能提升一下。

问题:Account不是可以new吗,我感觉不是串行啊

答案:你的困惑非常正常!这是一个很经典的误解。让我详细解释为什么锁 Account.class 会导致所有转账操作串行化。关键理解:Account.class 是唯一的。虽然你创建了多个 Account 对象,但是 Account.class 在整个 JVM 中只有唯一的一个!

向现实世界要答案

现实世界里,账户转账操作是支持并发的,而且绝对是真正的并行,银行所有的窗口都可以做转账操作。只要我们能仿照现实世界做转账操作,串行的问题就解决了。

我们试想在古代,没有信息化,账户的存在形式真的就是一个账本,而且每个账户都有一个账本,这些账本都统一存放在文件架上。银行柜员在给我们做转账时,要去文件架上把转出账本和转入账本都拿到手,然后做转账。这个柜员在拿账本的时候可能遇到以下三种情况:
1.文件架上恰好有转出账本和转入账本,那就同时拿走;
2.如果文件架上只有转出账本和转入账本之一,那这个柜员就先把文件架上有的账本拿到手,同时等着其他柜员把另外一个账本送回来;
3.转出账本和转入账本都没有,那这个柜员就等着两个账本都被送回来。

上面这个过程在编程的世界里怎么实现呢?其实用两把锁就实现了,转出账本一把,转入账本另一把。在 transfer() 方法内部,我们首先尝试锁定转出账户 this(先把转出账本拿到手),然后尝试锁定转入账户 target(再把转入账本拿到手),只有当两者都成功时,才执行转账操作。这个逻辑可以图形化为下图这个样子。

而至于详细的代码实现,如下所示。经过这样的优化后,账户 A 转账户 B 和账户 C 转账户 D 这两个转账操作就可以并行了。

class Account { private int balance; // 转账 void transfer(Account target, int amt){ // 锁定转出账户 synchronized(this) { // 锁定转入账户 synchronized(target) {
http://www.jsqmd.com/news/1037013/

相关文章:

  • 基于Springboot2+vue2的高校办公室行政事务管理系统
  • cyancat-开源数据库管理工具
  • 百度网盘下载神器pdown:免登录高速下载终极指南
  • JavaScript 的异步管家:彻底搞懂 Promise 原型方法
  • 广州亨得利维修正品配件保障:2026年粤海天河城大厦官方直营中心权威公示,原厂配件溯源全流程与假冒零件识别指南 - 劳力士官方售后中心
  • 网上公证办理流程是什么?网上公证需要准备哪些材料?[异地办事必备]
  • 学术研究图谱_academic-research-mapper
  • 大润发购物卡回收正规平台排行榜出炉,新手必看避坑指南 - 京顺回收
  • 广州二手包包变现避坑指南 全渠道实测,优质回收品牌实力盘点 - 奢侈品回收测评
  • AI原生开发时代,程序员的核心能力正在被重定义
  • #Linux监控与安全Day03:Prometheus全套部署与基础操作,Prometheus与Grafana,数据库监控,Alertmanager 监控报警机制
  • 094、 PCIE动态链路速度与宽度控制:一次深夜调试的启示
  • 2026重庆奢侈品包包回收排行|7家正规机构实测报价测评 - 名奢变现站
  • MPC5200时钟与电源管理:嵌入式SoC核心架构与低功耗实战
  • 2026宝安3家逸程门店回收体验横评:卡地亚手镯报价实测 - 逸程
  • 2026年6月旋转接头生产厂家汇总:旋转接头、回转接头、密封叠环定制采购指南 - 海棠依旧大
  • 2026无糖茶饮料十大品牌怎么选?看茶多酚含量、原料萃取工艺、场景适配度3个关键维度 - 新闻快传
  • Java表达式注入漏洞CVE-2021-41862深度解析与防御实践
  • 2026年夏邑全屋整装怎么选?博迪装饰16年口碑、零增项、自有工人体系深度评测 - 精选优质企业推荐官
  • 2026密封条选购指南:三元乙丙胶条/尼龙(PA)隔热条/防火阻燃密封条正规厂家推荐:新合星塑胶制品有限公司领衔 - 栗子测评
  • 北京股权代持执行案件律师:股权代持被执行怎么办?3类争议焦点与司法裁判规则 - 品牌2026
  • mysql主从数据同步方案的探讨,解决数据不一致问题
  • XY2100命令行工具:模块化与管道化设计提升数据处理效率
  • 2026苏州黄金回收大盘溯源|合规持证门店金价对标实测 - 奢侈品回收测评
  • 【学习笔记】TI-OSAL
  • PDF解密软件口碑榜:7条品牌口碑深度拆解 - 资讯速览
  • 2026长沙钻石回收门店实力排行,禹竞名奢汇综合实力稳居榜首 - 名奢变现站
  • 2026年甘肃卷闸门厂家深度评测|兰州工业门生产商选型避坑指南 - 精选优质企业推荐官
  • 2026年 陕西西南智能仓储服务/管理系统最新推荐榜单:数字化与自动化智能仓储实力厂家精选 - 品牌发掘
  • 本地人常去!长沙逸程品牌首饰回收,正规实体门店透明交易无套路 - 逸程