陌陌后端开发一面面经
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- Java 锁的升级机制是什么?
volatile、ReentrantLock和synchronized有什么作用和区别?- 线程池参数如何配置?
- 核心线程 20、最大线程 2000、队列容量 2 万的线程池,接口 QPS 从几百升到 8000 时如何优化?
- GC 日志通常包含哪些内容?
- CMS 垃圾回收器的特点是什么?
- 哪些情况会导致事务失效?
- 虚拟线程有什么作用?
- MySQL 的 B+ 树是什么?
- 了解哪些索引类型?
- 什么情况下索引会失效?
- 为什么两个带通配符的
LIKE条件可能无法使用索引? - Redis 分布式锁怎么创建?
- 释放 Redis 锁时要注意什么?
- 线程尚未执行完但锁过期了,如何续期?
- 缓存击穿和缓存雪崩分别怎么处理?
- Redis 大 Key 如何治理?
- HTTP 和 HTTPS 有什么区别?
- TCP 三次握手是什么?
- 如何把一棵树按顺序遍历并写入数组?
- 如何合并两个有序链表?
《参考解析》
锁升级通常从无锁、偏向、轻量级到重量级,目标是在低竞争时减少开销。volatile 保证可见性和禁止特定重排序但不保证复合操作原子性;锁提供互斥和更完整的内存语义。线程池应按任务的 CPU/IO 特征、延迟目标和队列积压量压测调参,不能只按 QPS 放大最大线程数。
事务失效常见于自调用、非 public 方法、异常被吞、代理未生效等。B+ 树适合范围查询和磁盘局部性;对索引列做函数、隐式类型转换、前导 % 或选择性过低都可能导致索引失效。
分布式锁应以唯一值原子加锁并在 Lua 脚本中校验持有者后删除;续期要有看门狗并处理进程失联。击穿可用互斥重建或逻辑过期,雪崩需过期时间打散、限流和多级缓存。算法题分别使用中序遍历与双指针合并即可。