Java 面试追问实战
面试中,第一问常常只要求一个结论,第二问就会改变条件:线程池还没到最大线程数,为什么拒绝了?异常明明被捕获,为什么最后仍然回滚?这个系列训练的是先说清题设,再沿执行过程推理,最后拿练习记录支撑回答。适合已学过 Java 并发与 Spring、正在准备后端面试的同学。
这里的对话均为原创教学场景,不对应真实公司面试、作者个人面试经历或录用结果。参考回答用于练习组织语言;涉及版本、代理方式、队列或事务资源时,要主动补充条件,不能把一段话套到所有项目。
两场完整演练,从哪里开始
| 演练 | 第一问 | 追问会走到哪里 | 本次产物 |
|---|---|---|---|
| 线程池:满了以后,请求去哪了? | 核心数2、最大数4,第3个任务会扩容吗? | 饱和时序、拒绝策略、调用线程阻塞、超时预算与故障定位 | 原源码运行记录、一张7次提交表、一份拒绝处理说明 |
| Spring 事务:为什么没按预期回滚? | 标了事务注解,抛异常就一定回滚吗? | 代理边界、自调用、受检异常、捕获与 rollback-only、提交和消息送达 | 调用链图、六组数据库状态对照、两处投递故障窗口 |
如果你能背出线程池参数,却解释不了第5个任务为什么可能先执行,先读线程池篇。如果你习惯把“返回成功”直接等同于“提交成功、通知成功”,先读事务篇。两篇都从一个固定题设开始,每一轮只改变少量条件,方便发现自己的推理在哪里断开。
一次30分钟怎样练
- 前3分钟先答。 遮住参考回答,录一段30秒回答。只说结论、关键路径和适用条件;把没把握的词原样记下,不先查资料润色。
- 接下来10分钟逐轮追问。 读完问题先暂停,写下预测,再展开参考推理。每次回答都标注“这轮改了哪个条件”:队列未满变成已满、外部代理调用变成自调用、异常逃出方法变成内部捕获。
- 再用12分钟验证一项。 线程池先运行已有源码;事务按文章中的独立练习准备依赖并执行。遇到环境问题就记录卡点,保留为未完成,不把预期结果填成实测结果。
- 最后5分钟重新表达。 对比最初录音,删掉无法解释的绝对词,补一句验证方法和一个尚未覆盖的边界。实际准备环境或排障超出时间时,另约下一次练习即可。
怎样判断自己已经讲清楚
能复述参考答案只是开始。请让同伴随机改变一个条件,例如把有界队列换成未指定容量的队列,或给自调用的外层方法增加一个事务;你应当重新推导结果,并说明原结论为何不再直接适用。
复盘时保留五项:原回答、变化的题设、修订结论、实际材料、下一步。实际材料可以是源码路径、JDK版本与stdout,也可以是数据库查询、代理调用链和故障注入记录。没有运行就写“源码推导”或“待验证”;一次实验成立,也只证明这次环境和这组条件下的结果。
项目表达同样要对得上证据。完成本地练习可以说“复现并解释了第7次提交被拒绝”,不能自动写成“解决过线上高并发故障”。只画出 outbox 方案而没有实现扫描、重试和幂等,就先说明设计与待验证项。两篇末尾都有表达示例和继续追问,帮助你把真实完成的部分讲完整。
把演练接到现有学习路径
需要安排复习顺序,进入 Java 面试六周路线;需要先找到薄弱项,进入 自测工作台,重点做“并发与事务”组,再回到这里解释题设为什么重要。答题数量不等于工程验证,也不用于推断面试结果。
原理与实现细节放在 工程指南 深读;检查表、复盘样例及已有源码统一从 Java 面试资料 取用。本站已有线程池源码和输出可直接核对;事务篇新增的练习代码明确标为尚未执行,运行后请保存自己的环境与结果。
下一次练习不必重新背整篇文章。挑出本次说不清的一轮,先补一个能观察结果的小实验,再用30秒把结论、证据与边界讲给别人听。
