25年11月 华兴致远 Java开发 一面
#JAVA##JAVA面经##JAVA内推#
1、自我介绍
思路 1 分钟版:姓名/学校/专业 → 技术栈 → 项目亮点 → 个人优势 → 求职意向
回答示例
面试官您好,我叫XXX,目前是XX学校XX专业大四学生。 主要技术栈是 Java、SpringBoot、MySQL、Redis、RabbitMQ、MyBatis,熟悉分布式基础、高并发、缓存、分布式锁等场景。 在校期间做过在线 OJ 判题系统、秒杀、后台管理类项目,熟悉业务开发、接口设计、问题排查与性能优化。 我学习能力比较强,喜欢钻研底层原理,做事踏实细心,希望能获得这次实习机会,快速投入开发并成长。
2、谈谈项目背景、难点以及是怎么解决的?
思路 背景 → 业务流程 → 自己负责模块 → 难点(2 个足够)→ 解决方案 → 效果
回答示例
我做的是一个在线 OJ 判题系统,目的是让用户可以在线提交代码,系统自动编译、运行、判题并返回结果。 主要包括用户模块、题目模块、提交模块、判题模块。我主要负责后端接口、权限认证、代码沙箱、Redis 缓存、数据库设计。
项目里主要有两个难点:
- 高并发下提交判题,容易出现重复判题、超时、资源占用过高 解决:用 Redis 分布式锁防止重复提交,用 Docker 隔离代码沙箱做资源限制,异步判题削峰。
- Redis 缓存和 MySQL 数据一致性问题 解决:采用“先更新数据库,再删除缓存”,配合延时双删保证最终一致,同时做缓存降级、缓存空值防止缓存穿透。
最终系统能稳定支撑高并发提交,接口响应快,判题准确安全。
3、如何实现分布式锁?
思路 主流三种:Redis 分布式锁、ZooKeeper 分布式锁、MySQL 分布式锁。重点讲 Redis。
回答示例
我最常用、项目里落地的是 Redis 分布式锁:
- 使用
SET key value NX EX 超时时间原子命令加锁 - 必须设置过期时间,防止死锁
- value 使用唯一值(如 UUID),释放锁时用 Lua 脚本 判断是不是自己的锁再删,避免误删
- 高可用场景可以用 Redisson 实现可重入锁、自动续期、联锁、红锁
也了解 ZK 分布式锁(临时顺序节点)和 MySQL 锁(悲观锁/乐观锁),但性能和易用性不如 Redis。
4、MyBatis 中 ${} 和 #{} 有什么区别?
思路 #{} 预编译、防注入;${} 字符串拼接、不防注入。
回答示例
- #{}: 预编译处理,会把参数变成 ? 占位符,可以防止 SQL 注入,参数是字符串会自动加引号。
- ${}: 直接字符串拼接,不会防 SQL 注入,用于传入表名、列名、order by 字段等不能预编译的内容。
实际开发中,**能用 #{} 绝对不用 {}。
5、MySQL 可重复读级别用什么解决大部分幻读?
思路 MVCC + 间隙锁(Next-Key Lock)
回答示例
在 MySQL InnoDB 的 可重复读隔离级别下:
- 普通查询(快照读): 依靠 MVCC(多版本并发控制) 读取历史数据,不会看到其他事务插入的数据,避免幻读。
- 当前读(for update / update / insert): 使用 Next-Key Lock(临键锁)= 行锁 + 间隙锁,锁住一个范围,防止其他事务在范围内插入数据,从而解决幻读。
所以可重复读基本解决了幻读问题,只有特殊的纯当前读混合场景才会出现幻读。
6、谈谈 synchronized 的锁升级过程
思路 无锁 → 偏向锁 → 轻量级锁 → 重量级锁
回答示例
synchronized 锁会随着竞争逐步升级,不能降级:
- 无锁:对象刚创建,没有竞争
- 偏向锁:默认开启,只有一个线程使用时,直接偏向该线程,不需要 CAS
- 轻量级锁:出现竞争,偏向锁失效,线程用 CAS 尝试加锁,自旋等待
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏在精不在多,内容分为八股文、大厂真实面经,面试通过后将offer和面试题私发给我,可退还专栏的收益部分费用。欢迎大家共建专栏
查看18道真题和解析