靖安科技 Java 全栈秋招一面:并发、Redis 与项目排障
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 能否介绍一下自己,目前是否已离职,上一家公司离职的原因是什么?
- HashMap 的底层结构是什么,为什么 JDK 8 引入红黑树?
- HashMap 是否线程安全,多线程同时 put 会有什么问题?
- ConcurrentHashMap 怎样保证并发访问安全?
- CAS 是什么?
- synchronized 和 ReentrantLock 有什么区别?
- ReentrantLock 的公平锁与非公平锁有什么区别?
- 线程池有哪些主要参数?
- 核心线程数为 10、最大线程数为 100、队列容量为 1000 时,任务持续提交会怎样改变线程数量?
- 线程和队列都满后有哪些拒绝策略,无界队列会带来什么问题?
- ThreadLocal 用来做什么,底层如何实现?
- Java 多线程中有哪些加锁方式?
- 如何用 Redis 实现分布式锁?
- Redisson 的锁怎样实现,如何续期?
- Redis 有哪些基础数据类型,各适合什么场景?
- 缓存穿透、击穿、雪崩有什么区别,分别如何处理?
- Redis 有哪些部署模式,哨兵负责什么?
- MySQL 的底层数据结构是什么?
- MySQL 有哪些事务隔离级别,InnoDB 默认是哪种?
- 如何理解可重复读?
- MySQL 主从复制如何工作,binlog 有哪些格式?
- MyBatis 怎样防止 SQL 注入,
#{}与${}有什么区别? - MyBatis 的缓存机制是什么?
- Spring AOP 有什么作用,底层如何实现?
- 类加载的双亲委派机制是什么?
- JVM 有哪些垃圾回收算法和收集器,能否介绍最熟悉的一种?
- 使用过哪些前端框架,能否独立完成前端开发?
- 是否了解 Vue 的生命周期等基础知识?
- 团队使用 React,你预计需要多久掌握相关基础?
- 项目是否使用 Docker 部署?
- 最近一段实习负责了什么,遇到哪些难点,如何解决?
- 项目中怎样用 Redisson 和延迟队列实现物联网古树养护流程?
- 已部署项目的 CPU 使用率突然升高,如何排查?
- 如果从需求分析到上线都由你负责,并允许使用辅助编程工具,你会怎样推进?
- 面试共有几轮,入职后承担哪些工作,面试官如何评价本次表现?
《参考解析》
线程池不是直接扩到 100 个线程
假设任务都未完成、线程池正常运行且队列初始为空:前 10 个任务创建核心线程;随后优先把任务放入容量为 1000 的队列;队列满后,再创建额外线程,最多达到 100 个。此时仍无法接收的任务才进入拒绝处理。真实运行中任务会完成,不能只按累计提交次数判断线程数。
无界队列下,任务通常会一直排队,maximumPoolSize 很难起到扩容作用,压力转而落到等待时长与内存占用上。线程池的入队和扩线程规则见 ThreadPoolExecutor 文档。
分布式锁先讲清谁有权解锁
单 Redis 实例的基本做法是 SET lockKey uniqueValue NX PX ttl,把“仅不存在时写入”和设置过期时间放进一条命令。释放时用原子操作检查 value 是否仍属于自己,再删除锁;直接 DEL 可能删掉锁过期后被别的请求获得的新锁。这一点见 Redis 分布式锁文档。
续期可以降低正常长任务因租约到期而失去锁的概率,但不能消除进程停顿、网络分区等问题。业务正确性仍应由数据库约束、版本条件等机制兜住。回答 Redisson 时,再结合实际使用版本说明是否启用看门狗、是否显式指定租约,以及失去锁后业务如何处理。
CPU 升高要先分清哪类消耗
先确认是哪个进程、哪些线程占用 CPU,再结合线程栈判断是业务循环、序列化、垃圾回收还是其他热点。JVM 线程转储中的线程标识与系统线程标识需要对应起来;连续采几次,比凭一份瞬时栈下结论可靠。再把异常时间与发布、请求量、错误日志联系起来。不要刚看到 CPU 高就先改线程池参数。
项目题讲自己的具体决策
延迟队列题可以沿着“何时创建任务、到期后谁消费、重复消费如何处理、失败怎样重试”回答,再说明养护状态如何更新。全流程交付题则拿一个真实需求展开:怎么确认验收条件、拆接口和页面、验证主要路径、安排上线检查。框架名称和工具名称可以带上,但不能代替这些具体动作。
原帖反问得到的信息是面试共四轮,岗位还涉及 C++;原帖未提供录用结果。