多线程并发的难题张大胖在做一个银行相关的项目写了一个Account的类用来表示一个用户的银行账号根据银行的常规业务自然要提供两个方法存款(deposit)和取款(withdraw)。为了防止多线程并发时导致的数据不一致问题张大胖给每个方法都加了synchronized 那意思很清楚想进入某个方法执行存款或取款操作必须得先获得一把锁才行。(注为了简化这里没有做边界条件检查。)但是在做转账操作的时候为了保证一致性必须得把两个账户都加上锁然后才可以操作于是张大胖写下了这样的代码他觉得很简单立刻就提交给Bill 让他Review。富有经验的Bill立刻就发现了问题马上对张大胖说“这样会出现死锁”张大胖说“这么简单的代码怎么可能有死锁”“假设线程1 做的操作是账户A给账户B转账 先锁住了A账户 接下来试图申请B账户的锁与此同时线程2 在从 账户B给账户A 转账 先锁住了B账户的锁 接下来试图申请A账户的锁。两个线程各自持有资源 然后等待获取对方的资源 都无法执行下去 死锁就出现了”张大胖无言以对不得不承认Bill是正确的。他问道“那怎么解决这个问题”“非常简单加锁的时候按次序来就可以了例如所有的线程无论是从A向B转账还是从B向A转账都先获得账号A的锁成功后再获得账户B的锁这样就没问题了。”张大胖说“那样代码会变得很古怪啊还得给两个账户排个顺序如果不知道背后的思想读起来很痛苦怪不得人家说多线程编程很难啊。”Bill说“是啊 其实线程这个东西就是一段代码的执行而已 是操作系统层面的概念可是我们苦逼的程序员不得不来面对它来背这个多线程并发的锅了。”2黑盒子下班后张大胖一直在思考这个问题既然线程是操作系统层面的概念能不能把线程的概念隐藏起来然后所有的操作都不用加锁呢 这样以来编程就会容易得多啊本质的问题是什么首先是共享的状态例如Account中的balance 多个线程都要读写 其次就是多个线程乱序、并发执行。能不能换个思路把这个Account对象看成一个黑盒子你想存款了就发一个存款的消息过来想取款就发一个取款的消息过来。不管是有一个消息还是有100个消息我统统放到黑盒子的一个队例中然后让Account对象一个个顺序处理不就可以了 根本不用在方法上加锁这样做其实就是把并发的操作变成了串行的操作而已不对如果调用方把取款消息放下就走 不等待返回结果 那就不是同步操作而是异步操作了但是如果取款的时候发现余额不足怎么通知调用方嗯调用方也必须是个黑盒子对象也向它发送异步消息这个消息也会在消息队列中存下来调用方“黑盒子”也会一个个处理。想到这一层张大胖激动起来取款和存款的操作就不用在加锁了码农们只要考虑黑盒子对消息的处理即可取出消息处理消息向别的黑盒子发送消息 根本不用考虑线程这样底层的概念了。3Actor模型第二天张大胖赶紧找到Bill, 向他炫耀自己的“新发明”。Bill不动声色“小伙子不错啊重新发明了轮子”“重新发明”“是啊你这个所谓黑盒子就是所谓Actor模型啊 它最早由Carl Hewitt在1973定义其消息传递的方式更加符合面向对象的原始意图 这一点我想你也体会到了要不你怎么把他们叫做黑盒子啊。”“1973年 我还没出生。唉看来这些概念已经被老前辈们都发明完了啊。”“Actor属于并发组件模型 可以把程序员从多线程并发或线程池等基础概念中解放出来。它有这么几个特点”Actor就是你说的黑盒子系统是由很多Actor组成。 Actor之间不共享状态但是会接收别的Actor发送的异步消息处理的过程中会改变内部状态也可能向别的Actor发送消息。Message:消息是不可变的 它的发送都是异步的Actor内部有个“MailBox”来缓存消息。MailBoxActor内部缓存消息的邮箱 其他Actor发送的消息都放到这里然后被本Actor处理类似有多个生成者和一个消费者的队例。张大胖说“和我之前的图差不多看来我确实是重新发明了轮子啊。”4用Actor实现转账Bill 笑道“这个Actor看起来很美但是编程的时候你得刷新一下你的思维才行。 大胖之前你的转账操作在多线程下不是会出现死锁吗 你考虑下如果用Actor的思路该怎么写”“首先得有两个Actor, 这两个Actor 表示了两个账户我把它们叫做旺财和小强。”“然后呢转账的逻辑怎么处理”张大胖想了一会“既然转账是在两个Actor之间发生的那可以引入一个协调者Actor叫做转账管家吧。不过由于消息都是异步的转账管家向旺财这个Actor发起扣款请求以后不知道什么时候才能真正执行扣款也不能立刻知道是否成功必须得等待啊这就有点麻烦了。”Bill说“我给你画个流程图你看看。”张大胖感慨地说“原来的多线程并发模型需要同时锁住两个账户然后才能进行转账。现在每个Actor都独立也把这个转账给搞定了。”Bill说“其实对于转账管家来说对每个转账的消息内部是隐含一个流程状态的就是先向某个账户扣款成功以后再向另一个账户增加最后给调用者返回状态这个次序是不能乱的。看到图中那个Transaction ID没有(Tx01)就是用来跟踪这个转账的事务。”4漏洞“我发现了一个漏洞你这个转账虽然看起来很美没有加锁但是和原来的是有区别的原来多线程思路是会把旺财和小强的账户同时锁住然后转账在这个过程中别人是不能操作这两个账号的 而你的Actor方案中当转账管家给旺财发消息扣款的时候小强其实是自由的如果这时候小强的账户被冻结那你的转账管家还得回滚旺财的扣款这多麻烦啊。”Bill“哈哈你小子还挺机灵的嘛看出了这个问题Actor模型非常适用于多个组件独立工作相互之间仅仅依靠消息传递的情况。如果想在多个组件之间维持一致的状态比如咱们例子中的转账那就不爽了。”“那怎么解决这个问题”“那必须得用一些特殊手段了有些实现Actor的框架例如Akka专门提供了像Coordinated /Transactor这样的机制来处理这个问题。有空的话给你仔细讲讲。”“好吧我回头看看这个Akka 对了 Actor虽然对用户隐藏了线程 但是总得有线程来处理消息吧。” 张大胖问道。“那是肯定的线程本质上就是一段代码的执行每个Actor在处理消息的时候肯定得和线程关联才行只不过Actor系统把线程这个概念给隐藏了。”“有哪些系统实现了Actor?” 张大胖接着问。“其实最著名的就是Erlang了Actor模型可以说是它的基础除了我们上面所说的还可以让Actor之间建立关联例如让一个Actor去监控另外一些Actor工作如果那些Actor崩溃了就新建一个Actor继续工作。在Java 领域刚才提到的Akka是比较知名的一个Actor框架。 ”
基于非对称纳什谈判的多微网电能共享优化方法 1. 项目背景与核心价值 多微网电能共享是当前分布式能源系统研究的热点方向。传统微网运行模式往往局限于自身发电与负荷平衡,难以实现区域范围内的资源优化配置。我们团队在解决某工业园区实际调度问题时发现,当多个微网之间存在电能互补潜力时…
Freemarker FreemarkerFreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成输出各种文件。它不仅可以用作表现层的实现技术,而且还可以用于生成 XML,html 或 Java 等。创建freemarker-test模块,引入依赖freemarker-test/pom.xml:&…
大模型微调实战:从LoRA/QLoRA到API部署全流程指南 这次我们聚焦大模型微调(Fine-Tuning),这是让通用大模型真正为你所用的核心技术。无论是想让模型精通金融分析、法律咨询,还是适应你公司的内部文档风格,微调都是必经之路。它不像预训练那样需要海量数据和算力,而是用相对较小的成本,让模型在特定任务上表现脱胎换骨。 …
从普通自行车到智能骑行终端:ESP32与传感器集成实战指南 1. 从“普通”到“不普通”:一辆自行车的创客式重生最近在社区里看到一个挺有意思的项目,标题叫“一辆「普通」的自行车”。初看之下,你可能会觉得这有什么好说的?不就是一辆代步工具嘛。但点进去之后,你会发现&#x…
粉笔直播课适合银行招聘冲刺吗 银行招聘考试季临近,不少考生在自学、录播课、线下班和直播课之间反复权衡。其中"直播课是否适合冲刺阶段"是被搜索频次较高的问题之一。本文围绕银行招聘考试的科目构成、冲刺阶段的学习痛点、直播课的覆盖能力与督学互动机制展开分析,并对比…
Jetson Nano 2GB上DeepStream实时视觉应用优化实战 1. 项目缘起:当“实时”遇上“资源天花板”在嵌入式AI视觉领域,Jetson Nano 2GB以其小巧的体积和相对亲民的价格,成为了无数开发者、学生和创客踏入边缘计算世界的“敲门砖”。然而,这块“砖”的分量,尤其是在处理视频…
173、手机影像调优实战:夜景模式、人像美颜与多摄融合的ISP参数调优 173、手机影像调优实战:夜景模式、人像美颜与多摄融合的ISP参数调优 一、从一次“翻车”的夜景调试说起 去年做某款旗舰机的前置夜景模式,实验室测出来信噪比漂亮得很,结果到了用户手里,拍出来的照片像蒙了一层雾——暗部细节全糊,亮部噪点像撒了盐。当时我盯着log看了三…
178、ISP Pipeline深度解析:RAW域黑电平校正与坏点校正的鲁棒性优化 178、ISP Pipeline深度解析:RAW域黑电平校正与坏点校正的鲁棒性优化 去年在调试一款车载前视摄像头时,遇到一个让人抓狂的Bug:白天光线充足时画面一切正常,但一到夜间或者进入隧道,暗部区域就开始出现密密麻麻的彩色噪点,像撒了一把彩色芝麻。更诡异的是,同样的模组换到…
NBM7100A与PIC18LF4685在低功耗物联网设备中的优化实践 1. 项目背景与核心挑战在物联网和便携式设备爆炸式增长的时代,电池供电设备面临着一个根本性矛盾:功能越来越复杂,但电池容量提升却相对缓慢。特别是那些使用不可充电初级电池(如CR2032纽扣电池)的设备,如何…
告别臃肿!3步让你的暗影精灵笔记本重获新生 告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%! 做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽 2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集 Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…
智慧飞行 大疆无人机一站式智能管控平台/支持大疆机场/私有化部署 从航线规划、自动飞行、AI识别到数据管理,一个平台全搞定 智慧飞行-大疆无人机一站式智能管控平台/支持大疆机场/私有化部署 企业级全域智能无人机一体化管控平台源码! 专为电力巡检、安防监控、应急救援、测绘勘察等行业打造,让您的无人机舰队实现 “无人化、自动化、智能化” 管理! 🎯 …
揭秘ChatGPT+Mathematica协同教学:为什么92%的初学者在72小时内建立函数直觉? 更多请点击: https://codechina.net 第一章:AI帮助理解数学概念 人工智能正以前所未有的方式重塑数学学习的路径。通过自然语言处理与符号计算的深度融合,AI不仅能解析抽象定义,还能将定理、证明和几何直觉转化为可交互、可验证的…
[C++]内存管理:串顺序存储的内存回收 在串(字符串)的顺序存储中,内存回收的方式取决于字符串的存储方式以及所使用的编程语言和相关库。以下以 C 为例进行说明,因为 C 对内存管理有较为直接的控制。 1. 基于 char 数组的串顺序存储 如果使用普通的 char 数组来存储字…
移动端游戏功耗测试实战:电流、功率、亮度和场景对比 移动端游戏功耗测试:先控制变量,再比较优化是否真的省电 摘要:功耗测试最容易犯的错误,是拿两次不同温度、不同亮度、不同场景的平均功率直接比较。本文给出一套可复现的游戏功耗测试方法,覆盖引擎特性验证、版本回归和黑盒体验测试,并说明如何把功耗与帧率、温控、CPU/G…
足球口袋教练 HarmonyOS 离线应用实战(03/20):ArkUI 首页仪表盘搭建 本文是“足球口袋教练 HarmonyOS 离线应用实战”系列第 3 篇。示例项目是一个 HarmonyOS / ArkTS / ArkUI 编写的离线足球训练助手,围绕真实页面、真实截图和可复现操作展开。 本篇要解决的问题 训练 App 的首页不能只展示欢迎语,它要解决“我现在该点哪…