公众号旧文
当事情没做完,又被打断,会发生什么?——从被打断的生活,到工程里的「可重入」
我发现,人和系统一样, 最容易出问题的时刻,不是在忙,而是在被打断的时候。
你可能也有过这种经历:
- 正在写一段很重要的消息
- 电话突然响了
- 接完电话回来
- 盯着屏幕半天,不知道刚才写到哪了
有时候你会补一句: “我刚才写到哪了来着?”
工程里,这一瞬间,有一个专门的词来形容: 不可重入。
一、什么叫“可重入”?
如果你直接去查书,可能会看到类似这样的描述:
可重入: 函数在执行过程中被再次调用,仍然能正确运行。
这句话是对的, 但它不太像人话。
我们换一种方式理解。
二、生活里的可重入:你能不能被打断?
想象一个场景:
你正在厨房切菜。
这时:
- 电话响了
- 你接起电话
- 说了两分钟
- 挂断
- 回到案板前
- 继续切菜
如果你能做到:
- 不切到手
- 不忘自己切到哪
- 不把盐当糖撒进去
那你这个“切菜系统”, 就是可重入的。
三、不可重入的人,会发生什么?
再想另一种情况。
你在:
- 算账
- 写代码
- 组织一句很复杂的话
这时有人突然问你一句:
你在干嘛?
你被迫回答, 再回来时发现:
- 思路断了
- 状态丢了
- 甚至要从头来过
这就是不可重入的典型表现。
不是你笨, 而是你当时的系统状态, 没有被妥善保存。
四、工程里为什么这么怕“不可重入”?
因为工程系统, 比人更容易被打断。
- 中断
- 多线程
- 信号
- 回调
- 异步事件
它们随时可能在你还没干完的时候插进来。
如果系统是不可重入的, 后果通常不是慢一点,而是:
- 数据错乱
- 状态覆盖
- 直接崩溃
五、一个很真实的工程比喻
假设你在记账:
- 先从钱包里拿钱
- 再在本子上记一笔
如果在 第 1 步和第 2 步之间, 有人又让你开始一次新的记账:
- 你可能把钱拿了两次
- 却只记了一笔账
系统这时候已经不可信了。
可重入的设计,要求的是:
无论你什么时候被打断,状态都要是安全的。
六、为什么“能暂停”的人,通常更稳?
你有没有发现:
- 有些人可以被随时打断
- 再回来,马上接上
- 情绪和思路都很稳定
而有些人:
- 一被打断就烦
- 一烦就乱
- 一乱就出错
这不是性格问题, 而是状态管理能力的差异。
工程里也是一样。
一个可重入的系统,通常意味着:
- 状态清晰
- 依赖少
- 每一步都是安全点
七、为什么工程师喜欢“局部变量”?
这是个很工程的细节, 但背后的直觉非常生活。
- 全局状态
- 局部状态
这就像:
- 把东西随手堆满整张桌子 vs
- 每做一件事,就用一个托盘装好
托盘多了没关系, 混在一起才是灾难。
八、可重入,其实是在尊重“现实的打断”
我越来越觉得:
可重入这个原则, 并不是假设世界会安静、顺序、听话。
它恰恰承认了一件事:
现实一定会打断你。
- 电话会响
- 网络会抖
- 人会插话
- 系统会抢占
真正成熟的系统,不是说:
你别打断我。
而是说:
你随时来,我都能接住。
九、把它放回生活里看
如果一个人:
- 事情做到一半,能安全停下
- 被打断后,能平稳回来
- 不依赖“一次性专注到结束”
那这个人, 在某种意义上是高度可重入的。
而这种能力, 无论在工程里,还是生活中, 都极其稀缺。
幂等解决的是:
你重复做了,会不会更糟?
而可重入解决的是:
你还没做完,又被打断了,会不会出事?
它们一个对抗重复, 一个对抗打断, 合在一起, 几乎覆盖了现实世界里最常见的混乱来源。
有时候我会觉得:
好的工程设计, 本质上是在替人类对抗一个 永远不够安静的世界。