阶跃星辰 Java 后端面试 - 设计模式与高并发核心总结
《面试题目》
一、Java设计模式理解
- 责任链模式的逻辑及落地场景。
- 策略模式如何消除if-else。
- 装饰器模式与AOP/动态代理的联系。
二、策略模式代码讲解
- 实战落地流程。
- Spring进阶:如何将策略类注入Map/List实现自动路由。
三、线程池详解
- 核心参数及任务流转过程。
- CPU密集型与IO密集型线程池配置原则。
- 常见避坑点:内存泄露、OOM、异常处理、监控缺失、上下文传递、动态扩缩容。
四、Redis分布式锁
- 主从延迟导致锁失效的解决方案。
- 锁过期与误删的原子性处理。
- 网络分区下的脑裂应对方案。
五、手撕题
- 实现生产者-消费者模型(基于ReentrantLock和Condition)。
六、TCP拆包粘包
- 固定长度方案。
- 长度字段+消息体方案。
《参考解析》
设计模式:责任链常用于过滤器链;策略模式核心是将逻辑封装在实现类中,通过Map路由代替硬编码;装饰器模式利用动态代理在方法执行前后插入逻辑,实现增强。
线程池优化:核心在于避免使用Executors创建无界队列,需手动配置线程池参数;使用allowCoreThreadTimeOut回收核心线程,接入监控系统感知积压,并引入TransmittableThreadLocal解决上下文丢失。
Redis分布式锁:锁失效需结合Redisson看门狗续期;防误删需用Lua脚本确保判断与删除的原子性;针对集群可用性,优先使用Redlock或结合AOF刷盘配置。
阻塞队列实现:使用ReentrantLock加锁,利用notEmpty.await()和notFull.await()进行线程协作,在生产后执行notEmpty.signal(),消费后执行notFull.signal()。
TCP拆包粘包:核心是应用层协议设计。推荐采用“长度字段+消息体”方案,接收端通过读取前置长度字节决定读取量,确保读取到的数据包完整且不粘连。