Java面试常见问题解析:线程池、HashMap与Spring循环依赖

📅 2026/8/3 12:22:49
Java面试常见问题解析:线程池、HashMap与Spring循环依赖
1. 当谢飞机遇上Java面试一场技术与人性的碰撞你好我是今天的面试官王严肃。 您好您好我是谢飞机飞行的飞飞机的机这段开场白看似平常却预示着一场令人啼笑皆非的技术交锋。作为从业十年的Java面试官我见过太多像谢飞机这样的候选人——他们带着满口流行术语和半生不熟的概念来面试却往往在最基础的问题上栽跟头。今天就让我们通过这场虚构的面试对话还原Java技术面试中最常见的翻车现场同时揭示这些问题的标准答案与考察要点。2. 线程池连环问从入门到放弃2.1 经典开场说说线程池的工作原理面试官谢先生我们先从基础开始。能解释下Java线程池的工作原理吗谢飞机这个简单线程池就是...呃...一个装线程的池子自信满满就像游泳池里有很多水线程池里有很多线程面试官内心OS很好这位候选人已经成功把线程池比喻成了水上乐园...实际上线程池(ThreadPool)的核心工作原理包含以下关键点任务队列新任务首先进入工作队列BlockingQueue核心线程当队列满时创建新线程直到达到corePoolSize扩容机制继续满队列则扩容到maximumPoolSize拒绝策略达到最大线程数后触发RejectedExecutionHandler// 标准线程池创建示例 ThreadPoolExecutor executor new ThreadPoolExecutor( 5, // corePoolSize 10, // maximumPoolSize 60, // keepAliveTime TimeUnit.SECONDS, new LinkedBlockingQueue(100), new ThreadPoolExecutor.AbortPolicy() );2.2 死亡追问七个参数各有什么用面试官推眼镜那请你详细说明下ThreadPoolExecutor的七个构造参数谢飞机开始冒汗七个不是四个吗等等我数数...coreSize,maxSize,还有...那个...aliveTime此时合格的候选人应该清晰阐述corePoolSize核心线程数即使空闲也不会回收maximumPoolSize最大线程数队列满时扩容上限keepAliveTime非核心线程空闲存活时间unit时间单位workQueue任务队列常用LinkedBlockingQueuethreadFactory线程创建工厂可定制线程名称等handler拒绝策略AbortPolicy、CallerRunsPolicy等2.3 实战坑点配置不当的OOM惨案面试官假设你配置了corePoolSizeInteger.MAX_VALUE会怎样谢飞机那肯定性能爆炸啊无限线程随便跑现实中的灾难场景// 错误配置示例 - 会导致OOM ExecutorService dangerPool Executors.newCachedThreadPool(); // 实际等同于 new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueueRunnable());关键教训永远不要使用无界队列或无限最大线程数。在高并发场景下这种配置会导致线程数量暴增内存耗尽每个线程需要约1MB栈空间最终引发OutOfMemoryError3. HashMap夺命三连问3.1 基础题HashMap的底层结构是面试官谈谈HashMap的底层实现原理谢飞机数组加链表JDK8之后还有红黑树这个我背过确实如此但更深层的要点包括数组链表结构通过hash(key)确定数组下标树化条件链表长度≥8且桶数量≥64时转为红黑树扩容机制默认负载因子0.75容量翻倍// HashMap关键参数 static final int DEFAULT_INITIAL_CAPACITY 16; // 默认大小 static final float DEFAULT_LOAD_FACTOR 0.75f; // 负载因子 static final int TREEIFY_THRESHOLD 8; // 树化阈值3.2 进阶题为什么线程不安全面试官为什么说HashMap是线程不安全的谢飞机因为...多个线程会打架试探性回答真实场景下的并发问题死循环风险JDK7扩容时可能形成环形链表数据丢失并发put可能导致元素被覆盖size不准确计数变量未同步解决方案对比方案原理性能损耗Hashtable全表锁高Collections.synchronizedMap对象锁中ConcurrentHashMap分段锁CAS低3.3 灵魂拷问重写equals为什么要重写hashCode面试官你知道为什么重写equals必须重写hashCode吗谢飞机眼神飘忽这个...好像是规范要求根本原因在于HashMap的存储机制// 错误示范 class Person { String id; // 只重写equals public boolean equals(Object o) { return ((Person)o).id.equals(this.id); } } // 使用时 MapPerson, String map new HashMap(); map.put(new Person(001), Alice); map.get(new Person(001)); // 返回null关键原则当两个对象equals相等时它们的hashCode必须相同。否则会导致HashMap无法正确获取值HashSet出现重复元素违反Java对象契约4. Spring的死亡三角循环依赖、三级缓存与AOP4.1 循环依赖困局面试官Spring如何解决循环依赖问题谢飞机这个...加Lazy注解或者改设计Spring的三级缓存机制一级缓存singletonObjects完整Bean二级缓存earlySingletonObjects早期引用三级缓存singletonFactoriesObjectFactory解决流程示例// A依赖BB依赖A 1. 创建A实例未初始化→ 放入三级缓存 2. 填充A的属性时发现需要B → 开始创建B 3. 创建B实例 → 需要注入A → 从三级缓存拿到A的ObjectFactory 4. 将A的早期引用注入B → B初始化完成 5. 将B注入A → A初始化完成4.2 三级缓存精讲面试官为什么需要三级缓存而不是两级谢飞机呃...三比二大擦汗设计考量三级缓存的存在意义处理AOP代理场景如果没有三级缓存代理对象可能被创建多次普通Bean和代理Bean可能同时存在通过ObjectFactory延迟决定最终对象形态4.3 AOP与事务的相爱相杀面试官Transactional失效的常见原因有哪些谢飞机这个我知道没加EnableTransactionManagement更多隐蔽陷阱自调用问题同类方法内调用不会走代理public class UserService { public void update() { this.insert(); // 事务失效 } Transactional public void insert() {...} }异常类型不匹配默认只回滚RuntimeException数据库引擎不支持如MyISAM不支持事务5. Redis实战中的那些坑5.1 缓存雪崩 vs 击穿 vs 穿透面试官说说缓存雪崩、击穿、穿透的区别谢飞机都是缓存没了...区别嘛...开始胡诌正解对比现象特征解决方案雪崩大量key同时过期随机过期时间击穿热点key突然失效互斥锁、永不过期穿透查询不存在的数据布隆过滤器、空值缓存5.2 分布式锁的正确姿势面试官如何用Redis实现分布式锁谢飞机setnx命令然后...记得要...呃...del完整方案要点// 正确实现 String lockKey order_lock_ orderId; String clientId UUID.randomUUID().toString(); try { // 加锁 Boolean result redisTemplate.opsForValue() .setIfAbsent(lockKey, clientId, 30, TimeUnit.SECONDS); if (Boolean.TRUE.equals(result)) { // 业务逻辑 } } finally { // 确保是自己的锁才释放 if (clientId.equals(redisTemplate.opsForValue().get(lockKey))) { redisTemplate.delete(lockKey); } }关键陷阱忘记设置过期时间 → 可能永久死锁业务超时大于锁超时 → 可能误删他人锁非原子性解锁 → 可能误删5.3 持久化策略选型面试官RDB和AOF如何选择谢飞机RDB...是快照AOF...是日志都启用最安全实际选型考量维度RDBAOF恢复速度快慢数据安全可能丢失几分钟数据最多丢失1秒数据文件大小小大适用场景灾备恢复高数据安全要求生产环境建议主节点关闭RDB从节点开启RDB备份AOF配置为everysec定期检查持久化文件完整性6. 面试生存指南从谢飞机到合格工程师6.1 八股文背后的逻辑面试官叹气你这些问题都是背的答案吧谢飞机突然正经其实我知道自己基础不牢但现在的面试不都这样吗...技术面试的本质考察点知识体系完整性能否建立技术概念间的联系深度思考能力是否理解技术背后的设计哲学实战经验是否真的用过而非仅听说过学习能力能否快速理解新概念6.2 反杀面试官的技巧当被问到不会的问题时错误示范这个我没了解过结束话题正确姿势这个问题我没深入研究过但我的理解是...展示思维过程示例 面试官了解Redission的看门狗机制吗 可以回答 我对具体实现不太熟悉但根据分布式锁的一般原理我认为应该存在某种续期机制来防止业务未完成但锁已过期的情况...6.3 持续成长路线图给谢飞机们的建议基础优先精读《Java并发编程实战》《深入理解JVM》源码阅读从ArrayList/HashMap开始逐步深入实践驱动用小型项目验证技术点如自己实现简易Spring知识整理建立技术笔记绘制知识图谱最后记住技术面试不是知识竞赛而是能力评估。当你真正理解而不仅仅是记住这些技术点时自然就能从容应对各种王严肃们的考验了。