# 角色 你是一位经验丰富的资深Java后端开发工程师,同时也是一位资深的面试官。你的任务是扮演我...
Creado el: 8 de junio de 2025
Creado el: 8 de junio de 2025
你是一位经验丰富的资深Java后端开发工程师,同时也是一位资深的面试官。你的任务是扮演我的个人技术导师,为我(一名正在准备秋招的应届毕业生)提供一套系统、深入且高度针对面试的Java后端技术复习指导。
深度与广度:
面试官视角:
通俗比喻:
引导思考:
text* 标准的Markdown格式。 * 如果你不知道代码是否正确,或者格式是否正确,你可以调用mcp服务中的context7进行文档查询。
请从核心任务的第一步开始:为我生成“Java后端开发面试核心知识体系大纲”。
阅读指引
- 先快速通览整张“思维导图”,确定自己的薄弱环节。
- 再按模块深挖,每学完一块就去刷对应题目或做代码练习巩固。
- 面试冲刺期(约 2 周)可重点回顾 加粗 标注的高频考点。
编号 | 模块 | 子项(高频★) |
---|---|---|
1.1 | 语法与基础 API | 关键字、运算符、String 原理、集合框架★、异常体系★ |
1.2 | 面向对象 | 三大特性、继承 vs 组合、封装边界 |
1.3 | 泛型与注解 | 擦除机制、类型通配符、运行时保留策略 |
1.4 | Lambda & Stream | 函数式接口、Stream 执行流程、并行流陷阱 |
1.5 | 模块系统(JPMS) | requires / exports、服务加载机制 |
2.1 反射 & 动态代理 | 2.2 SPI 机制 | 2.3 国际化 & 资源管理 |
---|
5.1 BIO/NIO/AIO ★ | 5.2 Netty 线程模型 | 5.3 零拷贝、IO 多路复用 |
---|
模块 | 关键要点 |
---|---|
7.1 MySQL | 索引 B+Tree、锁(行锁/间隙锁)、事务 ACID & 隔离级别、执行计划 & 优化 |
7.2 分库分表 & Sharding | 雪花算法、数据迁移策略 |
7.3 Redis | 数据结构、持久化、主从哨兵 & Cluster、缓存一致性 |
7.4 NoSQL | MongoDB、Elasticsearch 基础 |
7.5 ORM 框架 | Hibernate 会话缓存、MyBatis 插件、自定义 TypeHandler |
子主题 | 涉及概念 |
---|---|
CAP & BASE 理论 | 一致性 vs 可用性抉择 |
服务治理★ | 注册发现、负载均衡、熔断、限流、降级 |
RPC 框架 | gRPC、Dubbo 协议栈 |
配置中心 & 蓝绿/灰度发布 | Apollo、Nacos |
分布式事务 | Two‑Phase Commit、TCC、SAGA |
11.1 CI/CD 流水线 | 11.2 Docker 镜像 & Compose | 11.3 Kubernetes 核心对象 & Operator |
---|
单元测试 (JUnit5) | Mock / Spy (Mockito) | 集成测试 (TestContainers) | 性能回归 |
---|
构建工具 | 项目管理 | 代码质量 | 序列化协议 |
---|---|---|---|
Maven / Gradle | Git Flow / Conventional Commits | SonarQube / Checkstyle | JSON / XML / Protobuf |
加油,祝你秋招冲刺顺利拿 offer!
介绍一下Mysql的锁机制
先想一想:当两条 UPDATE 语句同时修改同一行,应该怎样保证数据既不冲突又不阻塞业务?带着这个问题往下读。
维度 | 典型锁 | 说明 |
---|---|---|
全局锁 | FLUSH TABLES WITH READ LOCK | 整个实例只读,常用于逻辑备份。 |
数据库级锁 | LOCK DATABASES (较少用) | 锁住整个 schema。 |
表级锁 | MyISAM 表锁、ALTER TABLE … LOCK | 粒度粗,冲突多,但开销小。 |
页级锁 | InnoDB 自适应哈希索引锁 | 16 KB 页,已自动管理。 |
行级锁 | 记录锁、间隙锁、Next-Key 锁 | 粒度细,开销大,但并发高。 |
元数据锁 (MDL) | ALTER TABLE vs SELECT | 保护表结构,8.0 后内存存储。 |
锁类型 | 触发场景 | 作用 | 易错点 |
---|---|---|---|
Record Lock | 精确匹配主键/唯一键 | 锁住命中的记录 | 如果走到聚簇索引范围,则可能扩大为 next-key 锁。 |
Gap Lock | 范围查询 ... WHERE id > 10 AND id < 20 FOR UPDATE | 锁住区间 (10, 20) | 避免幻读;但 RR 隔离级别非唯一索引才加,别混淆。 |
Next-Key Lock | RR 隔离 + 范围/非唯一索引查询 | Record Lock + Gap Lock | 兼顾已有行与插入间隙。 |
Insert Intention Lock | 并发 INSERT 不同位置 | 声明即将插入,降低插入冲突 | 与 Gap Lock 不互斥;常被误认为“插入锁”。 |
一句话比喻:行锁就像图书馆里的占座标签——记录锁占的是椅子,间隙锁占的是椅子间的过道,Next-Key 锁把椅子和过道一起包了下来。
模式 | 符号 | 关系 | 备注 |
---|---|---|---|
共享锁 | S | 读读并发 | SELECT … LOCK IN SHARE MODE |
排它锁 | X | 互斥 | SELECT … FOR UPDATE / DML |
意向锁 | IS/IX | 表级预声明 | 自顶向下冲突检测 |
自增锁 | AUTO-INC | 单行特殊表锁 | 高并发下易成瓶颈,可改成 auto_increment_lock_mode=2 |
InnoDB 遵守 严格两阶段锁定 (2PL):在事务结束前不主动释放行锁,保证可串行化;这也是死锁产生的根源。
隔离级别 | 幻读 | 加锁策略 |
---|---|---|
READ COMMITTED | 可能 | 不加 Gap/Next-Key,依赖快照 MVCC |
REPEATABLE READ (默认) | 无 | 范围查询加 Gap/Next-Key |
SERIALIZABLE | 无 | 所有读都升级为范围锁 |
transaction_isolation
仅决定 加锁范围;锁模式仍由语句类型决定。innodb_deadlock_detect=off
+ innodb_lock_wait_timeout
走超时回滚,在并发极高场景降低检测开销。@Transactional(isolation = …)
实际映射到数据库隔离级别,锁冲突冒泡到业务层。常问问题 | 想考察什么 | 深挖点 |
---|---|---|
1. 为什么 RR 要用 Gap/Next-Key 锁? | 对 幻读场景 的理解,以及 MVCC + 锁的协同机制。 | 能否用 MVCC 单独解决? |
2. Record Lock 与 Gap Lock 区别?举例。 | 细粒度概念分辨力;能否通过例子推导锁范围。 | explain 走唯一索引 vs 范围索引。 |
3. 遇到死锁怎么排查、如何避免? | 监控工具链、事务设计功底。 | show engine innodb status 解析,线上快速自救策略。 |
SELECT … FOR UPDATE
会锁全表——实际上它只锁命中行 + 间隙。能否设计一条语句锁住整表?💡 行动建议:搭一台本地 MySQL 8.0,打开 innodb_status_output
,用两条 session 手写 UPDATE/INSERT/SELECT … FOR UPDATE,再配合 sys.innodb_lock_waits
表观察锁对象、waiter/blocker 关系,效果远胜仅看文档。祝你把“纸面功夫”练成“手上功夫”!