并发编程面试题

目录概述

并发是区分 P6 和 P7 的分水岭。能说出几个关键字不算过关,能讲清楚 JMM、锁升级、AQS 原理、生产问题的才是真本事。

这个目录帮你把并发编程从"会用"提升到"理解本质",站在面试官视角拆解每一个知识点的追问链和判分标准。

【面试官心理】 我出并发题,通常不是从基础问题开始。我喜欢先问一个看似简单的问题:"synchronized 和 Lock 有什么区别?"能答出"一个是 JVM 管的一个是代码管的"的占 80%,能说清楚内部实现原理的占 40%,能讲明白谁的性能更好的只有 20%。

内容范围

核心主题

线程与进程

  • 进程与线程的区别:资源拥有 vs 执行单元
  • 线程创建方式:Thread、Runnable、Callable、线程池
  • 线程状态与状态转换:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED

JMM 内存模型

  • JMM 八大原子操作:lock、unlock、read、load、use、assign、store、write
  • Happens-Before 原则:程序顺序规则、监视器锁规则、volatile 规则、线程启动规则、线程终止规则
  • 可见性与有序性问题:缓存一致性、指令重排序

** volatile 关键字**:

  • 可见性原理:MESI 缓存协议、内存屏障
  • 有序性原理:StoreLoad 屏障、StoreStore 屏障
  • happens-before 语义:保证可见性但不保证原子性

synchronized 原理

  • Mark Word 结构:对象头 64 位的结构分布
  • 锁升级流程:无锁 → 偏向锁 → 轻量级锁 → 重量级锁
  • 偏向锁撤销:批量偏向、批量撤销
  • 轻量级锁膨胀:自旋次数、适应性自旋

CAS 与原子类

  • CAS 原理:Compare-And-Swap、ABA 问题
  • 原子类实现:Unsafe 类、park/unpark
  • LongAdder vs AtomicLong:分段思想、降低竞争

AQS 原理

  • AQS 核心结构:state 变量、双向等待队列
  • 独占模式 vs 共享模式
  • ReentrantLock:可重入原理、公平锁 vs 非公平锁
  • ReadWriteLock:读写分离思想
  • Condition:等待队列、signal/signalAll

并发工具类

  • CountDownLatch:倒计时门栓、线程协调
  • CyclicBarrier:循环栅栏、可重用
  • Semaphore:信号量、限流
  • Exchanger:线程间数据交换
  • Phaser:多阶段栅栏

ThreadLocal

  • 线程封闭原理:每个线程独立的副本
  • 内存泄漏问题:ThreadLocalMap 的 Entry 弱引用
  • 实战场景:链路追踪、日志上下文传递

面试题分级

级别考察重点期望回答判分标准
P5基本概念、关键字作用、线程状态能背出流程,不怵简单追问表面正确
P6底层原理、JMM 模型、锁升级能回答追问,不怵连环追问深度过关
P7AQS 源码、生产问题、并发优化有实战案例,能讲清 trade-off经验闭环

高频必考题 🔴

synchronized 原理

面试官问:"synchronized 原理是什么?它的锁存在哪里?"

这道题我能追问出五层:第一层说加在方法上是对象锁,第二层问锁存在哪里(Mark Word),第三层问 Mark Word 结构,第四层问锁升级流程,第五层问为什么 JDK 6 要做锁优化。每一层都会淘汰一批人。

【面试官心理】 我连环追问 synchronized,是想看他有没有真正看过 JVM 源码。只背了"可重入锁"三个字的人,在第三层就会卡住。而能讲到锁升级的,说明他对 JDK 6 的性能优化有了解,这种候选人在生产调优时会有思路。

volatile 的双重语义

面试官问:"volatile 怎么保证可见性?它能保证原子性吗?"

能说出"可见性"的占 80%,能说出"禁止指令重排序"的占 60%,能解释清楚内存屏障的占 20%,能说出 happens-before 语义的只有 10%。

AQS 原理

面试官问:"AQS 是什么?ReentrantLock 是怎么基于 AQS 实现的?"

这道题是 P6 和 P7 的分水岭。能说出 AQS 用了双向队列和 state 变量的占 50%,能讲清楚独占模式和共享模式的占 30%,能画出完整流程图的只有 10%。

CAS 与 ABA 问题

面试官问:"CAS 是什么?ABA 问题怎么解决?"

能说出 Compare-And-Swap 的占 70%,能说出 ABA 问题(版本号机制)的占 40%,能说出 AtomicStampedReference 的占 15%,能说清楚实际应用场景的只有 5%。

中频常考题 🟡

  • JMM 八大原子操作
  • Happens-Before 六条规则
  • Lock vs synchronized
  • ReentrantLock 可重入原理
  • ThreadLocal 内存泄漏
  • LongAdder 分段思想

低频了解题 🟢

  • Exchanger 原理
  • Phaser 使用场景
  • StampedLock

学习路径指引

P5 候选人(校招/初级社招)

先掌握线程基础、synchronized 和 volatile 的基本用法。理解线程状态转换、创建线程的三种方式。这个阶段能讲清楚基础概念即可。

P6 候选人(中级社招)

必须理解 JMM 和 happens-before。synchronized 要过一遍 JVM 源码,搞清楚 Mark Word 和锁升级。AQS 至少要能画出工作流程图。并发工具类的使用场景要清楚。

P7 候选人(高级/架构方向)

除了原理,必须有生产并发问题的排查经验。比如:线上死锁怎么排查、线程池参数怎么调、高并发场景下怎么避免锁竞争。能讲清楚具体的优化案例。

【面试官心理】 P7 候选人聊到并发,我通常会问:"你在项目里遇到过什么并发问题?怎么排查和解决的?" 能讲出完整案例的候选人,我会追问他用到了什么工具、当时是怎么分析的。这种真实的问题排查经验,比背任何概念都值钱。

生产避坑

死锁问题

四个条件:互斥、持有并等待、不可抢占、循环等待。线上死锁排查用 jstack、jconsole、Arthas。解决方案:避免重入锁嵌套、按顺序加锁、设置锁超时。

线程池参数设置

核心线程数、最大线程数、队列选择、拒绝策略。CPU 密集型 vs IO 密集型的线程数计算公式。线程池过大导致的问题:内存占用、线程切换开销。

内存泄漏

ThreadLocal 使用后未 remove,导致内存持续增长。弱引用设计是为了避免内存泄漏,但在线程池场景下,ThreadLocalMap 的 Entry 不及时清理仍然会出问题。

导航指引