有赞Java后端一面面经
面试题目
- 简单介绍一下你自己。
- 解决长耗时阻塞是怎么样的一个场景?解决思路是什么?
- 引入Redisson分布式锁的目的是为了解决重复上传的问题吗? 讲讲
- 分片上传和断点续传是怎么实现的?
- 项目中用过RocketMQ的哪些特性?
- 线程池在项目里大概是怎么用的?有哪些核心参数?
- 任务提交到线程池时,它的一个执行流程是怎么样的?
- 线程池默认的阻塞队列有多长?
- MySQL常用的引擎有哪些?
- MySQL大概有哪些索引类型?
- 什么是联合索引?你是怎么用的?
- 在规避回表的情况下,真实写SQL时应该怎么写?
- 简单聊一下什么是乐观锁?项目中如何解决支付回调并发问题?
- 理解CAS中的ABA问题吗?如何规避这种情况?
- 说一下SQL优化的大概流程。
- 简单讲一下Spring的IOC和AOP。
- 在Spring使用过程中会用到哪些Bean生命周期的接口?
- 设计模式有没有了解过?
- 目前在哪里?能接受来实习吗?实习时长大概有多长?
- 你有什么爱好?为什么喜欢听摇滚?
参考解析
- 分布式锁(Redisson):主要用于控制多实例并发操作,防止资源重复处理。通过设置过期时间避免死锁,使用看门狗机制自动延长锁时间。
- 线程池执行流程:核心线程 -> 阻塞队列 -> 最大线程 -> 拒绝策略。默认队列(LinkedBlockingQueue)容量为Integer.MAX_VALUE,容易导致OOM,生产环境建议自定义。
- MySQL索引优化:联合索引遵循“最左前缀原则”。规避回表通常通过“覆盖索引”实现,即SELECT字段仅包含索引字段,直接从索引树获取数据无需回表。
- CAS与ABA问题:ABA问题指内存值从A变B又变回A,导致线程误以为没变化。规避方法是引入版本号(AtomicStampedReference)或时间戳。
- Bean生命周期接口:常用包括
BeanPostProcessor(初始化前后)、InitializingBean(afterPropertiesSet方法)、DisposableBean(销毁时)。