拼多多服务端研发实习生一面面经
面试题目
一、Java基础与并发
- 自我介绍
- Java是否为你使用最多的开发语言
- 项目为实际实习项目还是个人自研项目
- Java包含哪些锁及对应特性
- 日常使用最多的锁类型
- Synchronized属于JVM层面还是其他层面的锁
- Synchronized与ReentrantLock的适用场景
- Spring Boot中Bean的加载流程
- Java如何实现类似C++析构函数的资源释放与优雅停机能力
- 多线程与多进程的区别,及对线程和进程的理解
- Java线程与操作系统线程的映射比例
- 单一线程异常是否会导致其他所有线程挂掉
二、计算机网络与操作系统 13. TCP三次握手过程,为什么要第三次握手 14. 父子进程间常见的通信机制 15. 同一应用内单个进程挂掉是否会影响其他进程 16. 多线程之间是否会相互影响 17. 写文件从用户态到内核态再到磁盘写入的全流程(Page Cache/Kernel Buffer)
三、数据库与中间件 18. MySQL表数据超两千万行推荐分库分表的原因及性能瓶颈 19. MySQL选用B+树作为索引数据结构的原因 20. MySQL binlog、redolog、undolog各自解决的核心问题 21. Redis高性能的核心体现 22. Redis Zset的底层实现与压缩列表应用 23. Redis缓存击穿、穿透、雪崩的概念与应对方案 24. 热点Key高并发访问下的多级缓存策略
四、项目与手撕 25. 项目难点、流程及接口设计 26. 下单流程中Redis扣减库存成功但MySQL更新失败的一致性处理 27. 手撕代码:链表排序(推荐归并排序)
参考解析
- Synchronized vs ReentrantLock:Synchronized是JVM层面的关键字,自动释放锁,适合简单同步;ReentrantLock是API层面的锁,支持公平锁、中断响应、tryLock和Condition等待通知机制,适合复杂场景。
- TCP三次握手原因:主要为了防止已失效的连接请求报文段突然又传送到了服务端,导致资源浪费;同时确保双方通信链路均正常(确认双方收发能力)。
- MySQL分库分表瓶颈:单表过大导致B+树高度增加,引发磁盘IO增多,查询效率下降。同时锁争用严重影响写入。
- Redis扣减库存一致性:推荐方案为先扣减Redis,异步发送MQ给MySQL更新;或使用分布式事务(Seata),若要求强一致性需通过Lua脚本或事务控制确保双端操作成功。
- 缓存击穿/穿透/雪崩:穿透即查不存在的key(布隆过滤器/缓存空值);击穿即热点key失效(加互斥锁/逻辑过期);雪崩即大量key同时失效(随机过期时间/多级缓存)。