面试官:Java线程池的核心参数了解吗?谢飞机:会用new Thread就不错了!

27 阅读4分钟

面试官:Java线程池的核心参数了解吗?谢飞机:会用new Thread就不错了!

面试官:请坐,先简单自我介绍一下。

谢飞机:面试官好,我叫谢飞机,三年Java开发经验,精通增删改查,熟悉Spring全家桶,会写SQL,能看懂Linux命令……

面试官(微微一笑):不错,那我们开始技术环节。先从基础开始——ArrayList 和 LinkedList 的区别是什么?

谢飞机:这个我会!ArrayList 是基于数组实现的,查询快,增删慢;LinkedList 是基于链表实现的,增删快,查询慢。

面试官:很好,理解到位。那 HashMap 的底层结构呢?JDK 8 之后有什么优化?

谢飞机:HashMap 底层是数组 + 链表 + 红黑树。当链表长度超过 8 且数组长度大于 64 时,链表转成红黑树,提升查找性能。

面试官:不错,基础扎实。那 ConcurrentHashMap 呢?它是怎么实现线程安全的?

谢飞机:嗯……它用了 synchronized?不对不对,好像是 CAS + synchronized?哦对!JDK 8 用的是 CAS + synchronized,锁的是链表头节点。

面试官:还行,基本答出来了。那我们聊聊多线程。创建线程的方式有哪些?

谢飞机:四种!继承 Thread,实现 Runnable,实现 Callable,还有线程池。

面试官:很好。那你说说线程池的核心参数有哪些?

谢飞机:啊?核心参数?嗯……corePoolSize、maximumPoolSize、workQueue……还有……keepAliveTime?好像还有一个……名字太长我忘了。

面试官:叫 threadFactory,最后一个叫 handler,拒绝策略。

谢飞机:对对对!就是它!我都背过,一紧张忘了。

面试官:那如果队列满了,会发生什么?

谢飞机:那就新建线程,直到最大线程数,再满了……就报错?

面试官:不一定报错,取决于拒绝策略。比如 AbortPolicy 就是抛异常,CallerRunsPolicy 是由调用者线程执行。

谢飞机:哦哦,原来如此。

面试官:继续。Spring 中 Bean 的作用域有哪些?

谢飞机:singleton、prototype,还有 request、session……

面试官:很好。那 Bean 的生命周期了解吗?

谢飞机:嗯……Spring 创建 Bean,然后初始化,最后销毁。具体流程……记不清了。

面试官:我们跳过。Redis 用过哪些数据结构?

谢飞机:String、Hash、List、Set、ZSet!

面试官:很好。那 Redis 实现分布式锁要注意什么?

谢飞机:要用 SETNX!还要设置过期时间!防止死锁!

面试官:那如果业务还没执行完,锁过期了怎么办?

谢飞机:呃……加个定时任务,续命?

面试官:那是看门狗机制。你了解过 Redisson 吗?

谢飞机:听说过,但没用过……

面试官:最后一个问题。MySQL 的索引失效场景有哪些?

谢飞机:like 左模糊会失效,比如 '%abc';还有对字段做函数操作,比如 where date(create_time) = '2024-01-01';或者类型转换,比如字符串字段传了数字……

面试官:不错,回答得挺全面。今天先到这里,回去等通知吧。

谢飞机:好的,谢谢面试官!


答案详解

1. ArrayList vs LinkedList

  • ArrayList:基于动态数组,支持随机访问,查询 O(1),增删 O(n)(需移动元素)。
  • LinkedList:基于双向链表,增删 O(1)(已知位置),查询 O(n)。
  • 使用场景:频繁查询用 ArrayList,频繁增删用 LinkedList。

2. HashMap 底层结构(JDK 8+)

  • 数组 + 链表 + 红黑树。
  • 当链表长度 ≥ 8 且哈希桶数组长度 ≥ 64 时,链表转红黑树(减少查找时间复杂度从 O(n) 到 O(log n))。
  • 扩容机制:负载因子默认 0.75,容量翻倍。

3. ConcurrentHashMap 线程安全实现(JDK 8)

  • 使用 CAS + synchronized
  • 锁粒度更细:synchronized 锁住的是链表头节点或红黑树根节点,而不是整个桶。
  • 不允许 key/value 为 null(避免歧义)。

4. 线程池核心参数(ThreadPoolExecutor)

  1. corePoolSize:核心线程数,常驻线程。
  2. maximumPoolSize:最大线程数。
  3. keepAliveTime:非核心线程空闲存活时间。
  4. unit:时间单位。
  5. workQueue:任务队列(如 LinkedBlockingQueue)。
  6. threadFactory:线程工厂,可自定义线程命名等。
  7. handler:拒绝策略(AbortPolicy、CallerRunsPolicy 等)。

5. Spring Bean 作用域

  • singleton:单例(默认)。
  • prototype:每次获取都创建新实例。
  • request/session/application:Web 环境下对应生命周期。

6. Redis 分布式锁注意事项

  • 使用 SET key value NX EX seconds 原子操作。
  • 设置唯一 value(如 UUID)防止误删。
  • 锁续期:Redisson 的看门狗机制自动续期。
  • 防止锁失效:业务执行时间 > 过期时间时,需异步续期。

7. MySQL 索引失效场景

  • 左模糊查询:LIKE '%abc'
  • 对字段使用函数或表达式:WHERE YEAR(create_time) = 2024
  • 类型不匹配:字符串字段传数字导致隐式转换
  • OR 条件部分无索引
  • 最左前缀原则破坏:联合索引 (a,b,c) 查询条件未包含 a