news 2026/9/3 5:37:14

面试官:Java多线程和JUC你懂吗?谢飞机:我飞过!——互联网大厂技术面试搞笑实录(一)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
面试官:Java多线程和JUC你懂吗?谢飞机:我飞过!——互联网大厂技术面试搞笑实录(一)

面试官:Java多线程和JUC你懂吗?谢飞机:我飞过!——互联网大厂技术面试搞笑实录(一)

场景:某互联网大厂会议室,阳光明媚但气氛紧张。面试官面无表情地翻着简历,对面坐着一位自称“精通全栈”的求职者——谢飞机。


第一轮提问:Java 多线程基础

面试官:谢飞机是吧?我看你简历写了“熟悉Java多线程编程”,那你先说说,ThreadRunnable有什么区别?

谢飞机:这个我知道!Thread是类,Runnable是接口!而且 Java 不支持多继承,所以用Runnable更好!

面试官(微微点头):不错,理解到位。那你说说,为什么推荐使用线程池而不是手动创建线程?

谢飞机:因为……new Thread() 太费内存了!就像买手机,不能每次打电话都买个新手机吧?得租!线程池就是租赁公司!

面试官(嘴角微扬):比喻有点意思。那你知道ExecutorService怎么关闭吗?

谢飞机:当然!调用shutdown()就行!它会等任务执行完再关。还有个shutdownNow(),那是直接拔电源!

面试官:还行。那如果我想让主线程等待所有子线程完成后再继续,怎么做?

谢飞机:用join()啊!或者CountDownLatch,我还会用CyclicBarrier呢!

面试官:嗯,基本功可以。


第二轮提问:JUC 并发工具进阶

面试官:既然提到CountDownLatch,说说它和CyclicBarrier的区别?

谢飞机:呃……都是倒数计数器?一个是从10减到0,一个是反过来加?

面试官:……

谢飞机:哦不对!CountDownLatch是一个线程等其他多个线程完成;CyclicBarrier是多个线程互相等,大家一起出发,像百米赛跑!

面试官:勉强及格。那Semaphore呢?用来做什么?

谢飞机:信号灯!控制并发数量的!比如停车场有10个车位,Semaphore(10),进来一辆车 acquire(),出去 release()!

面试官:例子不错。那ReentrantLocksynchronized有啥区别?

谢飞机:都能加锁!但ReentrantLock更高级,可以尝试锁、可中断、还能指定公平锁!

面试官:那它是怎么实现可重入的?

谢飞机:呃……内部有个计数器?谁持有锁就记名字?具体我忘了,反正能重入!

面试官(皱眉):行吧……


第三轮提问:线程安全与实战场景

面试官:现在有一个高并发场景,多个线程同时对一个共享变量进行累加操作,你会怎么处理?

谢飞机:用volatile

面试官volatile能保证原子性吗?

谢飞机:呃……能?不能?好像不能……那用synchronized块包起来!

面试官:还有别的办法吗?

谢飞机:用AtomicInteger!CAS机制!无锁并发!

面试官:那 CAS 有什么缺点?

谢飞机:ABA问题!还有自旋太耗CPU!

面试官:怎么解决 ABA?

谢飞机:呃……加版本号!AtomicStampedReference

面试官:不错。最后一个问题:线程池的核心参数有哪些?

谢飞机:corePoolSize、maximumPoolSize、workQueue、keepAliveTime、threadFactory、handler……

面试官:如果队列满了且线程数达到最大,会发生什么?

谢飞机:看拒绝策略!默认是 AbortPolicy,抛异常!还可以自己定义!

面试官:好,今天的面试就到这里。你的基础还行,有些地方需要加强。回去等通知吧。

谢飞机(起身鞠躬):谢谢面试官!我回去就把 JUC 源码打印出来当被子盖!


参考答案详解

1. Thread 和 Runnable 的区别

  • Thread是类,Runnable是接口。
  • Java 单继承限制下,实现Runnable更灵活。
  • 实际上Thread类也实现了Runnable接口。
  • 推荐使用RunnableCallable配合线程池使用。

2. 为什么使用线程池?

  • 避免频繁创建/销毁线程带来的资源消耗。
  • 控制并发数量,防止资源耗尽。
  • 提供统一的管理机制(监控、统计、拒绝策略等)。

3. ExecutorService 关闭方式

  • shutdown():温和关闭,不再接收新任务,等待已提交任务执行完毕。
  • shutdownNow():立即关闭,尝试中断正在运行的线程,返回未执行的任务列表。

4. 主线程等待子线程

  • thread.join():适用于少量线程。
  • CountDownLatch:适合一个或多个线程等待其他多个线程完成。
  • CyclicBarrier:多个线程相互等待,达到屏障点后一起继续。
  • Phaser:更灵活的同步工具,支持动态注册。

5. CountDownLatch vs CyclicBarrier

| 对比项 | CountDownLatch | CyclicBarrier | |--------|----------------|---------------| | 计数方向 | 向下减少 | 达到数量即触发 | | 是否可重用 | 不可重用 | 可重用(reset) | | 使用场景 | 主线程等待多个任务完成 | 多个线程互相等待 | | 实现机制 | 计数为0唤醒 | 达到阈值触发 |

6. Semaphore 作用

  • 用于控制同时访问特定资源的线程数量。
  • 常用于限流、资源池(如数据库连接池)。
  • acquire()获取许可,release()释放许可。

7. ReentrantLock vs synchronized

| 特性 | synchronized | ReentrantLock | |------|--------------|---------------| | 语法级别 | JVM 层面(关键字) | API 层面(代码调用) | | 可中断 | 否 | 是(lockInterruptibly) | | 超时获取 | 否 | 是(tryLock(timeout)) | | 公平性 | 非公平 | 可设置公平锁 | | 条件变量 | wait/notify | Condition |

8. ReentrantLock 实现可重入原理

  • 内部使用AQS(AbstractQueuedSynchronizer)实现。
  • 维护一个 state 变量表示锁状态,thread 记录持有锁的线程。
  • 同一线程重复获取锁时,state++,释放时 state--,直到为0才真正释放。

9. 共享变量并发累加解决方案

  • synchronized同步块
  • ReentrantLock显式锁
  • AtomicInteger等原子类(基于 CAS + volatile)
  • LongAdder(高并发下性能更好)

10. CAS 缺点

  • ABA问题:值从A→B→A,CAS 无法察觉中间变化。解决方案:AtomicStampedReference加版本号。
  • 自旋开销:循环重试可能导致 CPU 空转。可通过Thread.yield()优化。
  • 只能保证单个变量的原子性:多变量需使用锁或其他机制。

11. 线程池核心参数

  • corePoolSize:核心线程数
  • maximumPoolSize:最大线程数
  • keepAliveTime:非核心线程空闲存活时间
  • unit:时间单位
  • workQueue:任务队列
  • threadFactory:线程工厂
  • handler:拒绝策略

12. 拒绝策略

  • AbortPolicy:抛出RejectedExecutionException
  • CallerRunsPolicy:由提交任务的线程执行
  • DiscardPolicy:静默丢弃
  • DiscardOldestPolicy:丢弃队列中最老的任务,重试提交
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 19:15:04

基于Kotaemon的会议室预订智能助手开发

基于Kotaemon的会议室预订智能助手开发 在现代企业办公环境中,一个看似简单的任务——“订个会议室”——却常常演变成一场耗时的协调战。员工需要打开日历系统、手动筛选空闲时段、确认设备配置、检查权限、拉群通知同事……稍有疏忽,就可能出现时间冲…

作者头像 李华
网站建设 2026/9/3 1:22:43

Kotaemon助力企业构建私有化知识库问答系统

Kotaemon助力企业构建私有化知识库问答系统 在当今企业数字化转型的浪潮中,知识不再只是静态文档的堆砌,而是驱动效率与决策的核心资产。然而,当员工面对分布在Confluence、SharePoint、本地服务器甚至个人笔记中的海量资料时,“我…

作者头像 李华
网站建设 2026/9/2 5:51:15

Kotaemon微服务架构拆分建议:适应大规模部署

Kotaemon微服务架构拆分建议:适应大规模部署 在企业智能对话系统逐渐成为客服、知识管理与自动化办公核心组件的今天,一个关键问题摆在了架构师面前:如何让原本为本地开发设计的AI框架,顺利演进为支撑高并发、可扩展、易维护的企业…

作者头像 李华
网站建设 2026/9/3 4:11:02

【例3-2】单词查找树(信息学奥赛一本通- P1337)

【题目描述】在进行文法分析的时候,通常需要检测一个单词是否在我们的单词列表里。为了提高查找和定位的速度,通常都画出与单词列表所对应的单词查找树,其特点如下:1.根结点不包含字母,除根结点外每一个结点…

作者头像 李华
网站建设 2026/9/2 6:33:10

5、设计 Citrix MetaFrame 互联网络全攻略

设计 Citrix MetaFrame 互联网络全攻略 1. 设计基础:业务需求驱动技术 在设计 Citrix MetaFrame 环境时,业务需求是核心驱动力。这一过程通常遵循从业务需求到技术愿景,再到设计、测试、试点和全面部署的循环。例如,若业务需求是消除网络病毒,可部署 Citrix MetaFrame 并…

作者头像 李华
网站建设 2026/9/2 23:15:31

10、优化用户体验:Citrix MetaFrame 配置指南

优化用户体验:Citrix MetaFrame 配置指南 1. 引言 在当今数字化办公环境中,为用户打造良好的体验至关重要。通过在 MetaFrame 服务器上配置会话参数,管理员能够成功创建积极的用户体验。衡量 Citrix MetaFrame 部署成功与否的一个重要标准,就是终端用户对部署在其上的应用…

作者头像 李华