阶跃星辰 Java 后端面试 - 设计模式与高并发核心总结

《面试题目》

一、Java设计模式理解

  1. 责任链模式的逻辑及落地场景。
  2. 策略模式如何消除if-else。
  3. 装饰器模式与AOP/动态代理的联系。

二、策略模式代码讲解

  1. 实战落地流程。
  2. Spring进阶:如何将策略类注入Map/List实现自动路由。

三、线程池详解

  1. 核心参数及任务流转过程。
  2. CPU密集型与IO密集型线程池配置原则。
  3. 常见避坑点:内存泄露、OOM、异常处理、监控缺失、上下文传递、动态扩缩容。

四、Redis分布式锁

  1. 主从延迟导致锁失效的解决方案。
  2. 锁过期与误删的原子性处理。
  3. 网络分区下的脑裂应对方案。

五、手撕题

  1. 实现生产者-消费者模型(基于ReentrantLock和Condition)。

六、TCP拆包粘包

  1. 固定长度方案。
  2. 长度字段+消息体方案。

《参考解析》

设计模式:责任链常用于过滤器链;策略模式核心是将逻辑封装在实现类中,通过Map路由代替硬编码;装饰器模式利用动态代理在方法执行前后插入逻辑,实现增强。

线程池优化:核心在于避免使用Executors创建无界队列,需手动配置线程池参数;使用allowCoreThreadTimeOut回收核心线程,接入监控系统感知积压,并引入TransmittableThreadLocal解决上下文丢失。

Redis分布式锁:锁失效需结合Redisson看门狗续期;防误删需用Lua脚本确保判断与删除的原子性;针对集群可用性,优先使用Redlock或结合AOF刷盘配置。

阻塞队列实现:使用ReentrantLock加锁,利用notEmpty.await()notFull.await()进行线程协作,在生产后执行notEmpty.signal(),消费后执行notFull.signal()

TCP拆包粘包:核心是应用层协议设计。推荐采用“长度字段+消息体”方案,接收端通过读取前置长度字节决定读取量,确保读取到的数据包完整且不粘连。