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

39 阅读4分钟

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

面试官:请进。

谢飞机:您好,我是谢飞机,毕业于蓝翔技校计算机系,主修挖掘机与Java开发。

面试官:……(沉默三秒)我们开始吧。


第一轮:Java 基础与多线程

面试官:说说线程和进程的区别?

谢飞机:进程是妈,线程是娃,一个妈可以生多个娃!

面试官:……勉强算对。那 start()run() 方法有什么区别?

谢飞机start() 是启动线程,让线程去跑;run() 是自己跑,不走线程那条道!

面试官:嗯,说得还行。

面试官:那 volatile 关键字的作用是什么?

谢飞机:就是……让它变得很易挥发,一碰就没了!

面试官:……你碰过吗?

谢飞机:没,但我女朋友 volatile 过我。

面试官:好了,下一轮。


第二轮:JUC 与线程池

面试官:线程池的核心参数有哪些?

谢飞机:有 corePoolSize、maximumPoolSize、workQueue、threadFactory、handler,还有……爱情和梦想。

面试官:前五个是对的。那如果核心线程数满了,任务会怎么处理?

谢飞机:先放队列,队列满了再开新线程,最多到 maximumPoolSize,再不行就……拒绝。

面试官:不错,那你了解哪些拒绝策略?

谢飞机:有 AbortPolicy,直接抛异常;CallerRunsPolicy,让调用者自己跑;还有……温柔拒绝和冷暴力拒绝。

面试官:……后两个是你编的吧?

谢飞机:我觉得应该有!

面试官:行吧。那 ConcurrentHashMap 为什么是线程安全的?

谢飞机:因为它加了锁,而且是分段锁,像小区保安,每人管一段。

面试官:JDK 1.8 后呢?

谢飞机:呃……还是保安,但换成了人脸识别加 synchronized?

面试官:……差不多。


第三轮:Spring 与分布式

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

谢飞机:singleton、prototype,还有 request、session……application 我也用过,但不知道干啥的。

面试官:那 singleton 是如何保证全局唯一的?

谢飞机:Spring 把它存到一个 map 里,下次要的时候直接从 map 拿,就跟缓存一样!

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

谢飞机:用 setnx,设置 key,谁设成功谁拿到锁!

面试官:如果服务宕机了呢?

谢飞机:那就……锁永远拿不到了,得等宇宙重启。

面试官:所以怎么办?

谢飞机:加个过期时间!用 set nx ex 一起上!

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

谢飞机:like 左模糊、or 连接没索引、函数操作字段、类型转换……还有,老板不让用索引。

面试官:……行了。

面试官:今天先到这里,回去等通知吧。

谢飞机:您看我这表现,是有希望还是……等通知?

面试官:等通知的意思就是——我们觉得你不太合适,但又不想当面说破。

谢飞机:哦……那我能加个微信吗?

面试官:不能。


答案解析

1. 线程 vs 进程

  • 进程:操作系统资源分配的基本单位,每个进程有独立的内存空间。
  • 线程:CPU 调度的基本单位,共享进程的内存,通信更高效。

2. start() vs run()

  • start():由 JVM 调用,启动新线程执行 run() 方法。
  • run():普通方法调用,不会开启新线程。

3. volatile

  • 保证变量的可见性(修改后立即写回主内存)和禁止指令重排序,但不保证原子性。

4. 线程池核心参数

  1. corePoolSize:核心线程数
  2. maximumPoolSize:最大线程数
  3. workQueue:任务队列
  4. threadFactory:线程创建工厂
  5. handler:拒绝策略

5. 拒绝策略

  • AbortPolicy:抛出异常
  • CallerRunsPolicy:由调用线程执行任务
  • DiscardPolicy:静默丢弃
  • DiscardOldestPolicy:丢弃队列中最老的任务

6. ConcurrentHashMap

  • JDK 1.7:分段锁(Segment)
  • JDK 1.8:CAS + synchronized,数组桶位加锁,性能更高

7. Spring Bean 作用域

  • singleton:单例,容器唯一实例
  • prototype:每次获取都创建新实例
  • request/session/application:Web 相关作用域

8. Redis 分布式锁

  • 使用 SET key value NX EX seconds 原子操作
  • 必须设置过期时间,防止死锁
  • 最佳实践:Redisson 可重入锁

9. MySQL 索引失效场景

  • LIKE '%xx' 左模糊
  • OR 条件中部分字段无索引
  • 对字段使用函数或表达式:WHERE YEAR(create_time) = 2024
  • 类型隐式转换:字符串字段传数字
  • 最左前缀原则破坏

谢飞机虽然搞笑,但这些问题你真的懂了吗?建议收藏,反复阅读。