并发编程面试题
目录概述
并发是区分 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 弱引用
- 实战场景:链路追踪、日志上下文传递
面试题分级
高频必考题 🔴
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 不及时清理仍然会出问题。