25年11月 华兴致远 Java开发 一面

#JAVA##JAVA面经##JAVA内推#

1、自我介绍

思路 1 分钟版:姓名/学校/专业 → 技术栈 → 项目亮点 → 个人优势 → 求职意向

回答示例

面试官您好,我叫XXX,目前是XX学校XX专业大四学生。 主要技术栈是 Java、SpringBoot、MySQL、Redis、RabbitMQ、MyBatis,熟悉分布式基础、高并发、缓存、分布式锁等场景。 在校期间做过在线 OJ 判题系统、秒杀、后台管理类项目,熟悉业务开发、接口设计、问题排查与性能优化。 我学习能力比较强,喜欢钻研底层原理,做事踏实细心,希望能获得这次实习机会,快速投入开发并成长。

2、谈谈项目背景、难点以及是怎么解决的?

思路 背景 → 业务流程 → 自己负责模块 → 难点(2 个足够)→ 解决方案 → 效果

回答示例

我做的是一个在线 OJ 判题系统,目的是让用户可以在线提交代码,系统自动编译、运行、判题并返回结果。 主要包括用户模块、题目模块、提交模块、判题模块。我主要负责后端接口、权限认证、代码沙箱、Redis 缓存、数据库设计

项目里主要有两个难点:

  1. 高并发下提交判题,容易出现重复判题、超时、资源占用过高 解决:用 Redis 分布式锁防止重复提交,用 Docker 隔离代码沙箱做资源限制,异步判题削峰。
  2. Redis 缓存和 MySQL 数据一致性问题 解决:采用“先更新数据库,再删除缓存”,配合延时双删保证最终一致,同时做缓存降级、缓存空值防止缓存穿透。

最终系统能稳定支撑高并发提交,接口响应快,判题准确安全。

3、如何实现分布式锁?

思路 主流三种:Redis 分布式锁、ZooKeeper 分布式锁、MySQL 分布式锁。重点讲 Redis。

回答示例

我最常用、项目里落地的是 Redis 分布式锁

  1. 使用 SET key value NX EX 超时时间 原子命令加锁
  2. 必须设置过期时间,防止死锁
  3. value 使用唯一值(如 UUID),释放锁时用 Lua 脚本 判断是不是自己的锁再删,避免误删
  4. 高可用场景可以用 Redisson 实现可重入锁、自动续期、联锁、红锁

也了解 ZK 分布式锁(临时顺序节点)和 MySQL 锁(悲观锁/乐观锁),但性能和易用性不如 Redis。

4、MyBatis 中 ${} 和 #{} 有什么区别?

思路 #{} 预编译、防注入;${} 字符串拼接、不防注入。

回答示例

  1. #{}: 预编译处理,会把参数变成 ? 占位符,可以防止 SQL 注入,参数是字符串会自动加引号。
  2. ${}: 直接字符串拼接,不会防 SQL 注入,用于传入表名、列名、order by 字段等不能预编译的内容。

实际开发中,**能用 #{} 绝对不用 {}。

5、MySQL 可重复读级别用什么解决大部分幻读?

思路 MVCC + 间隙锁(Next-Key Lock)

回答示例

在 MySQL InnoDB 的 可重复读隔离级别下:

  1. 普通查询(快照读): 依靠 MVCC(多版本并发控制) 读取历史数据,不会看到其他事务插入的数据,避免幻读。
  2. 当前读(for update / update / insert): 使用 Next-Key Lock(临键锁)= 行锁 + 间隙锁,锁住一个范围,防止其他事务在范围内插入数据,从而解决幻读。

所以可重复读基本解决了幻读问题,只有特殊的纯当前读混合场景才会出现幻读。

6、谈谈 synchronized 的锁升级过程

思路 无锁 → 偏向锁 → 轻量级锁 → 重量级锁

回答示例

synchronized 锁会随着竞争逐步升级,不能降级

  1. 无锁:对象刚创建,没有竞争
  2. 偏向锁:默认开启,只有一个线程使用时,直接偏向该线程,不需要 CAS
  3. 轻量级锁:出现竞争,偏向锁失效,线程用 CAS 尝试加锁,自旋等待

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

本专栏在精不在多,内容分为八股文、大厂真实面经,面试通过后将offer和面试题私发给我,可退还专栏的收益部分费用。欢迎大家共建专栏

全部评论

相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务