Java 面试核心技术点完整详解(并发 / 架构 / 数据库 / AI Agent)

comsince
FshareIM Team整理了 20 个 Java 高频面试考点的系统讲解,涵盖并发内存模型、Spring 事务、高并发架构、数据库优化、分布式事务,以及 AI Agent / RAG 方向。每节附有代码示例与标准回答模板,可直接用于面试准备。
目录
- 一、JMM — Java 内存模型
- 二、线程间通信与顺序控制
- 三、Spring 事务失效的场景
- 四、Spring 统一异常处理
- 五、Spring Boot 跨域解决方案
- 六、高并发 SaaS 系统架构设计
- 七、身份认证 — JWT 原理与安全
- 八、限流算法与熔断机制
- 九、Redis 限流具体实现
- 十、MySQL 查询性能优化 — 四层体系
- 十一、分库分表与全局唯一 ID
- 十二、读写分离与数据一致性
- 十三、缓存与数据库一致性
- 十四、配置中心 — Apollo 与 CAP 理论
- 十五、分布式事务
- 十六、AI Coding 使用技巧
- 十七、高并发 SaaS AI Agent 架构
- 十八、RAG 应用完整设计
- 十九、AI Agent 自我反思与工具重试
- 二十、多 Agent 架构设计
一、JMM — Java 内存模型
核心概念
JMM(Java Memory Model)是 JVM 规范中定义的一套规则,描述了 Java 程序中各种变量的访问规则,解决多线程环境下共享变量的可见性、有序性、原子性三大问题。
现代 CPU 每个核心都有自己的高速缓存,线程在运行时会把主内存中的变量拷贝到本地缓存中操作,操作完后再写回主内存,由此导致可见性问题:
三大核心问题
1. 可见性(Visibility)
2. 有序性(Ordering)— 双重检查锁 DCL
3. 原子性(Atomicity)
happens-before 原则(高频考点前4条)
| 规则 | 说明 |
|---|---|
| 程序顺序规则 | 同一线程内,前面的操作 happens-before 后面的操作 |
| volatile 规则 | volatile 写操作 happens-before 后续的 volatile 读操作 |
| 锁规则 | unlock 操作 happens-before 后续对同一锁的 lock 操作 |
| 线程启动规则 | Thread.start() happens-before 线程内的任何操作 |
volatile vs synchronized vs AtomicInteger
| 特性 | volatile | synchronized | AtomicInteger |
|---|---|---|---|
| 可见性 | ✅ | ✅ | ✅ |
| 有序性 | ✅ | ✅ | ✅ |
| 原子性 | ❌ | ✅ | ✅ |
| 性能 | 高(无锁) | 低(加锁) | 中(CAS 自旋) |
| 适用场景 | 状态标志位、DCL | 复合操作、临界区 | 计数器、累加器 |
标准回答:JMM 定义了 Java 线程与主内存之间的交互规则,解决可见性、有序性、原子性三个核心问题。volatile 解决可见性和有序性,但不保证原子性,所以 i++ 不能仅靠 volatile,需要 AtomicInteger 或 synchronized。
二、线程间通信与顺序控制
面试原题:一个线程结束了,另一个线程才开始,怎么实现?
CountDownLatch(最常用)
CompletableFuture(现代写法,推荐)
各方案对比
| 方案 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
CountDownLatch | 等待多个线程完成 | 灵活,可等待多个 | 一次性,不可重置 |
Thread.join() | 简单顺序依赖 | 简单直观 | 强耦合 |
CompletableFuture | 复杂异步流程编排 | 链式调用,功能强大 | 学习成本略高 |
Semaphore | 资源访问控制 | 可控制并发数量 | 相对复杂 |
三、Spring 事务失效的场景
Spring 事务底层原理
Spring 事务基于 AOP 动态代理实现。只要绕过了代理对象,事务就会失效。
8 个失效场景
场景1:同类内部方法调用(最常见)
场景2:方法非 public
Spring AOP 默认只能增强 public 方法。private、protected 方法上的 @Transactional 均失效。
场景3:异常被 catch 吞掉
场景4:异常类型不匹配
场景5:多线程环境
场景6-8:Bean 未被 Spring 管理 / 数据库引擎不支持事务(MyISAM)/ 传播行为配置为 NOT_SUPPORTED。
常用传播行为
| 传播行为 | 说明 |
|---|---|
REQUIRED(默认) | 有事务就加入,没有就新建 |
REQUIRES_NEW | 总是新建事务,挂起当前事务 |
NESTED | 嵌套事务,有保存点 |
NOT_SUPPORTED | 非事务执行,挂起当前事务 |
四、Spring 统一异常处理
五、Spring Boot 跨域解决方案
跨域根本原因:浏览器同源策略要求协议、域名、端口三者完全一致。
方案一:Nginx(推荐生产环境)
方案二:Spring Boot 全局配置
方案三:@CrossOrigin 注解(精细控制)
方案四:Spring Cloud Gateway
六、高并发 SaaS 系统架构设计
标准分层架构
多级缓存策略
消息削峰填谷
七、身份认证 — JWT 原理与安全
Session vs JWT
| 特性 | Session | JWT |
|---|---|---|
| 存储位置 | 服务端(内存/Redis) | 客户端(Header/Cookie) |
| 扩展性 | 差(需要集中存储) | 好(无状态,天然支持集群) |
| 安全性 | 较高(服务端可控) | 需要额外机制(黑名单) |
JWT 三段结构
实现代码
安全问题
Token 无法主动失效:用 Redis 维护黑名单,修改密码时将旧 Token 加入黑名单。
推荐:双 Token 机制
八、限流算法与熔断机制
四种限流算法
| 算法 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 固定窗口 | 固定时间段内计数 | 简单 | 边界突刺 | 低精度限流 |
| 滑动窗口 | 窗口随时间滑动 | 精确,无突刺 | 内存开销大 | 精确限流 |
| 漏桶 | 固定速率流出 | 强制匀速 | 突发流量全丢 | 流量整形 |
| 令牌桶 | 固定速率放令牌,允许突发消耗 | 允许突发 | 实现略复杂 | API 限速(推荐) |
熔断三态状态机
九、Redis 限流具体实现
滑动窗口限流(Lua 脚本保证原子性)
使用:每个 IP 每秒最多 10 次请求
十、MySQL 查询性能优化 — 四层体系
第一层:SQL 写法优化
第二层:索引设计
覆盖索引:把查询列都放进索引,避免回表
联合索引最左前缀:
第三层:架构优化
- 读写分离:写主库,读从库,主从 binlog 异步同步
- 分库分表:垂直分库(按业务)+ 水平分表(按 user_id % N)
第四层:参数配置优化
十一、分库分表与全局唯一 ID
雪花算法(Snowflake)— 推荐
十二、读写分离与数据一致性
主从复制原理
不一致解决方案
方案1:强制读主库(写操作后,在 ThreadLocal 中打标,下次读走主库)
方案2:半同步复制(主库等待至少一个从库确认收到 binlog 后才提交,牺牲写性能)
方案3:缓存延迟双删(写操作后设置短期"主库优先读"标记,TTL 与主从延迟时间一致)
十三、缓存与数据库一致性
Cache Aside Pattern(旁路缓存)
写流程:先更新 DB,再删缓存(不是更新缓存)
为什么是删缓存而不是更新缓存? 并发场景下,两个线程先后更新 DB,但后更新的线程先更新缓存,先更新的线程后更新缓存,导致缓存值是旧数据。删缓存则下次读时重新从 DB 加载,得到正确值。
延迟双删策略
缓存三大问题
| 问题 | 定义 | 解决方案 |
|---|---|---|
| 穿透 | 查询不存在的数据,每次都打到 DB | 布隆过滤器 / 缓存空值 |
| 击穿 | 热点 key 过期,大量请求同时打到 DB | 互斥锁 / 逻辑过期 |
| 雪崩 | 大量 key 同时过期,DB 被打垮 | 过期时间加随机偏移 / 多级缓存 |
十四、配置中心 — Apollo 与 CAP 理论
CAP 理论
分布式系统中,一致性(C)、可用性(A)、分区容错(P) 三者最多同时满足两个。
| 中间件 | CAP 类型 | 说明 |
|---|---|---|
| Zookeeper | CP | 选举期间不可用,保证一致性 |
| Nacos(临时实例) | AP | 优先可用,允许短暂不一致 |
| Eureka | AP | 没有主节点,高可用 |
| Apollo | CP | 基于 MySQL,配置一致性优先 |
| Redis Cluster | AP | 异步复制,允许少量数据丢失 |
十五、分布式事务
四种方案
Seata AT 模式(最常用)
AT 模式原理:一阶段本地提交 + 生成 undo_log;二阶段提交时删 undo_log,回滚时用 undo_log 生成补偿 SQL。
TCC 模式(适合高并发)
Try(资源预留)→ Confirm(真正执行)→ Cancel(释放预留)
三大问题:空回滚(Cancel 比 Try 先到)/ 幂等(重复调用)/ 悬挂(Try 晚于 Cancel 到)。
方案选型
| 方案 | 一致性 | 性能 | 适用场景 |
|---|---|---|---|
| XA | 强一致 | 差 | 短事务、对一致性要求极高 |
| Seata AT | 最终一致 | 较好 | 大多数业务场景(推荐) |
| TCC | 最终一致 | 好 | 高并发、对资源隔离要求高 |
| 本地消息表 | 最终一致 | 好 | 异步场景 |
十六、AI Coding 使用技巧
Claude Code 工作流程
提高准确度的关键:CLAUDE.md 上下文文件
精确描述问题的 Prompt 模板
十七、高并发 SaaS AI Agent 架构
AI 场景在第六章基础架构上,额外需要处理:
十八、RAG 应用完整设计
离线:文档预处理链路
父子分块策略(推荐):
- 大块(1024字符)用于保留上下文 → 存储
- 小块(256字符)用于检索 → 找到小块后返回对应大块
- 检索精度 + 上下文完整性两全其美
在线:检索链路
RRF 算法:
置信度过低的处理策略
十九、AI Agent 自我反思与工具重试
ReAct 框架流程
自我反思(Reflection)实现
工具重试与防死循环
二十、多 Agent 架构设计
Supervisor 模式(主从模式)
LangGraph 图结构(推荐)
Agent 间通信方式
| 通信方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 共享状态(AgentState) | 同进程内 | 简单,无序列化开销 | 无法跨进程 |
| HTTP/REST | 跨服务,同步调用 | 标准接口,语言无关 | 耦合度高 |
| MQ(消息队列) | 跨服务,异步调用 | 解耦,可靠,支持广播 | 最终一致性 |
| A2A 协议 | 异构 Agent 系统 | 标准化,互操作性强 | 生态尚在建设 |
记忆口诀汇总
| 知识点 | 口诀 |
|---|---|
| JMM | 三问题"可见、有序、原子",volatile 管前两个,synchronized 全包 |
| 熔断 | 三态"关-开-半开",失败率触发,半开态探测恢复 |
| MySQL优化 | SQL层→索引层→架构层→参数层 |
| 事务失效 | 内部调用、非public、异常吞、类型不对、非Spring管理 |
| JWT | 三段"头-体-签",Payload 不能放密码,失效靠黑名单 |
| 限流算法 | 固定-滑动-漏桶-令牌桶,生产首选令牌桶 |
| 缓存一致性 | 更新DB后删缓存,高并发加延迟双删 |
| ReAct | 想-做-看-反思,防死循环靠max_iterations |
| RAG置信度 | 不降阈值,选降级/换路/引导/补知识库 |