816 字
约 2 分钟
11
S25-J03 · 源码阅读方法(附三个示例)
适用读者:打开源码就"从 main 开始读"的人。
前置:S25-J02、S04-J01(集合源码)。
覆盖旧文:2408(428) 1135(516) 1114(492) 1125(419) + 源码类 = 3,932 点。
扩展点:E-S25-005(读源码三步)。
上一篇:S25-J02 · 场景题框架:超时、幂等、峰值
下一篇:S25-J04 · 系统设计面试。
1. 一句话结论
读源码不要"从头读",要"带着问题读":先定一个具体问题,再顺着调用链走,最后用一句话总结机制。
三步(E-S25-005):
① 提问:我要搞清什么?(如"getBean 什么时候创建代理")
② 顺链:入口 → 关键调用 → 目标代码(只读这一段)
③ 收口:用一句话写出机制 + 一个反例
2. 三个示例(旧卡对应的真实场景)
2.1 getBean 全流程(A-1135)
问题:单例 Bean 在什么时候被创建?
顺链:getBean → doGetBean → getSingleton → createBean → doCreateBean
收口:"getBean 是懒加载入口;单例在第一次 getBean 时才创建(除非 preInstantiateSingletons 预热)。"
反例:@Lazy 会推迟到真正使用时。
2.2 延迟队列(A-1114)
问题:延迟队列怎么做到"到点才出队"?
顺口:入队带到期时间 → 出队时比较时间 → 未到期放回/等待
收口:"延迟的关键是"按到期时间排序",不是"睡到那个时间"。
2.3 线程状态转换(A-1125)
问题:BLOCKED 与 WAITING 差在哪?
收口:"BLOCKED 等锁,WAITING 等唤醒"(S05-B02 已实测)。
3. 读源码的四个技巧
| 技巧 | 作用 |
|---|---|
| 只读关键路径 | 别读异常分支/兼容代码 |
| 用调试器打断点 | 看真实调用栈 |
| 画一张调用链图 | 比记代码有效 |
| 找"最小可复现例子" | 跑一遍再读 |
判据:"我能用一句话说清这段代码在干什么吗?" 不能 → 还没读懂。
4. 面试里怎么讲源码
| 讲法 | 效果 |
|---|---|
| 背类名/方法名 | 追问就崩 |
| 讲机制 + 边界 | 显得真读过 |
| 讲"我调试时发现" | 最可信 |
"为什么'调试时发现'最可信":它不可背诵。
5. 五个误区
| 误区 | 真相 |
|---|---|
| "从 main 开始读" | 会迷失在无关代码 |
| "读得越多越好" | 带问题读才有效 |
| "记住方法名就行" | 追问就露 |
| "不用画图" | 调用链图最有用 |
| "源码没有文档" | 官方文档常比源码清楚 |
6. 自检
- 读源码三步?
getBean的收口结论是什么?- 延迟队列的关键是什么?
- 四个技巧?
- 为什么"调试时发现"最可信?
7. 下一篇
S25-J04 · 系统设计面试:从需求到方案
源码讲完,下一篇讲"45 分钟怎么讲清一个系统"。
本篇属于系列《S25 · 求职与面试》。旧文来源:A-2408/1135/1114/1125 + 源码类卡;扩展点 E-S25-005。
S25-J03 · 源码阅读方法(附三个示例)
https://www.clxhxhhr.top/posts/5584/ 评论
0 条
还没有评论,先写一条吧。