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) {

相关新闻

雅琪诺“礼服工艺”的技术体系解析:从裁剪到定型的全流程精工标准

雅琪诺“礼服工艺”的技术体系解析:从裁剪到定型的全流程精工标准

摘要:本文从工业工程角度,系统梳理雅琪诺“礼服工艺”窗帘的全流程技术标准,涵盖裁剪、缝制、定型、装配等关键工序。 正文: 1. 裁剪工序:立体裁剪与精密制版 采用电脑挂式吊裁,配合恒温恒湿生产环境-。…

2026/6/18 16:46:29阅读更多 →
PCL-Silane 硅烷改性PCL普通PCL与硅烷PCL性能对比

PCL-Silane 硅烷改性PCL普通PCL与硅烷PCL性能对比

一、分子结构差异1. 普通 PCL 基础骨架:仅由 ε- 己内酯开环聚合形成线性聚酯链,末端多为羟基或烷基封端,无额外活性功能基团 分子作用方式:分子间仅依靠酯基弱极性作用力结合,无法与无机基底形成化学键合 结构局限&am…

2026/6/18 16:41:28阅读更多 →
095、PCIE物理层测试模式:从信号眼图到误码率实战

095、PCIE物理层测试模式:从信号眼图到误码率实战

095、PCIE物理层测试模式:从信号眼图到误码率实战 最近在调一块新板卡,链路训练老是失败,LTSSM卡在Recovery状态出不来。示波器抓到的差分信号看起来幅度正常,但就是无法稳定锁定。后来打开物理层的测试模式,才发现发送端的预加重参数配置有问题,导致接收端眼图张开度不…

2026/6/18 16:41:28阅读更多 →
AI写专著必备!20万字专著一键生成,AI专著撰写工具大揭秘!

AI写专著必备!20万字专著一键生成,AI专著撰写工具大揭秘!

学术专著写作困境与AI工具助力 撰写学术专著不仅测试学术能力,更是对心理承受力的一大考验。与团队合作的论文写作不同,专著创作通常是一个人独自面对的过程。从选定主题到搭建框架,再到具体内容的撰写与修订,研究者几乎需要在每…

2026/6/18 17:51:49阅读更多 →
CANN/PTO乘加运算指令

CANN/PTO乘加运算指令

# TMULADDDST 【免费下载链接】pto-isa Parallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This repository offers high-performance, cross-platform tile operations acr…

2026/6/18 17:51:49阅读更多 →
c12测试策略终极指南:配置加载的单元测试与集成测试完全解析

c12测试策略终极指南:配置加载的单元测试与集成测试完全解析

c12测试策略终极指南:配置加载的单元测试与集成测试完全解析 【免费下载链接】c12 ⚙️ Smart Configuration Loader 项目地址: https://gitcode.com/gh_mirrors/c1/c12 c12测试策略是确保智能配置加载器可靠性的关键。⚙️ 作为一款强大的配置管理工具&…

2026/6/18 17:51:49阅读更多 →
如何用Aimless.js提升Web开发体验:表单验证、UI效果等10个实用场景

如何用Aimless.js提升Web开发体验:表单验证、UI效果等10个实用场景

如何用Aimless.js提升Web开发体验:表单验证、UI效果等10个实用场景 【免费下载链接】aimless.js The missing JavaScript randomness library. 项目地址: https://gitcode.com/gh_mirrors/ai/aimless.js Aimless.js是一个轻量级的JavaScript随机数生成库&…

2026/6/18 17:51:49阅读更多 →
Index-1.9B性能评测:19亿参数模型如何超越7B级别竞品

Index-1.9B性能评测:19亿参数模型如何超越7B级别竞品

Index-1.9B性能评测:19亿参数模型如何超越7B级别竞品 【免费下载链接】Index-1.9B 项目地址: https://ai.gitcode.com/hf_mirrors/zhouhui/Index-1.9B Index-1.9B是一款令人惊艳的19亿参数轻量级大语言模型,在多项评测中表现卓越,甚至…

2026/6/18 17:51:49阅读更多 →
NSK高刚性精密滚珠丝杠技术手册

NSK高刚性精密滚珠丝杠技术手册

为您详细整理 W2503SS-2P-C5Z5 滚珠丝杠的完整参数规格、技术特点及产品应用。 | 编码 | 属性 | 数据 | 内容 | |------|------|--------|------| | A | 联 | 133 | 许 | | B | 系 | 2798 | 经 | | C | 我 | 2959 | 理 |该型号属于 NSK 精密机械…

2026/6/18 17:46:48阅读更多 →
ZigBee HA智能家居开发实战:从集群模型到NXP JN516x代码实现

ZigBee HA智能家居开发实战:从集群模型到NXP JN516x代码实现

1. ZigBee HA:智能家居的“通用语言”与开发基石如果你正在或计划踏入智能家居设备开发领域,尤其是基于ZigBee协议,那么“ZigBee Home Automation”这个名词你一定不陌生。它不仅仅是ZigBee联盟定义的一套应用层规范,更是确保不同…

2026/6/18 0:00:24阅读更多 →
Java毕设选题推荐:基于 Spring Boot 的个人随笔博客运维管理系统的设计与实现 基于 Spring Boot 的用户原创博客分享社区【附源码、mysql、文档、调试+代码讲解+全bao等】

Java毕设选题推荐:基于 Spring Boot 的个人随笔博客运维管理系统的设计与实现 基于 Spring Boot 的用户原创博客分享社区【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/6/18 0:00:24阅读更多 →
JN517x嵌入式开发实战:看门狗、脉冲计数器与I2C接口的深度解析与避坑指南

JN517x嵌入式开发实战:看门狗、脉冲计数器与I2C接口的深度解析与避坑指南

1. 项目概述在嵌入式开发领域,尤其是基于NXP JN517x这类无线微控制器的项目中,系统稳定性和与外设的可靠交互是两大核心挑战。前者关乎产品能否在无人值守的复杂环境中长期运行,后者则决定了设备能否准确感知世界并与其他芯片“对话”。JN517…

2026/6/18 0:00:24阅读更多 →