多线程并发与锁 面试知识点

整理自模拟面试,覆盖多线程基础、线程安全、synchronized、CAS、ReentrantLock、读写锁、公平锁、wait/notify


1. Android 里的多线程机制是什么

一句话:Android 采用单 UI 线程模型,主线程负责界面绘制和事件分发,耗时任务需要放到后台线程执行,再通过消息机制或协程切回主线程更新 UI。

为什么需要多线程

常见实现方式

面试总结


2. 什么是线程安全问题

一句话:多个线程并发访问共享可变状态时,如果程序结果仍然正确且可预期,就说明它是线程安全的;否则就会出现线程安全问题。

常见问题类型

Android 里的常见场景

常见解决思路


3. synchronizedvolatile 的区别

volatile 解决什么问题

synchronized 解决什么问题

适用场景

面试结论


4. synchronizedReentrantLock 的区别

相同点

不同点

维度 synchronized ReentrantLock
实现层级 JVM 内置关键字 JDK 显式锁
锁释放 自动释放 需手动 unlock()
功能 简单直接 更灵活
可中断 不支持 支持 lockInterruptibly()
尝试获取锁 不支持 支持 tryLock()
公平性 不可配置 可选公平/非公平
条件队列 wait/notify Condition

如何选型


5. synchronized 的原理是什么

一句话synchronized 本质是基于对象监视器 monitor 实现的内置锁,JVM 通过对象头中的 Mark Word 记录锁状态,并通过加锁与解锁建立线程间的内存可见性关系。

字节码层面的表现

锁对象

为什么能保证可见性


6. 对象头里有什么

Java 对象内存结构通常分为:
- 对象头
- 实例数据
- 对齐填充

对象头的核心内容

  1. Mark Word
  2. 保存锁标志位
  3. 保存对象 hashCode
  4. 保存 GC 分代年龄
  5. 在加锁后保存偏向线程、锁记录指针或 Monitor 指针

  6. 类型指针 Klass Pointer

  7. 指向类元数据
  8. JVM 通过它知道对象属于哪个类

  9. 数组长度

  10. 仅数组对象额外持有

7. Mark Word 在不同状态下存什么

Mark Word 会随着对象状态变化复用不同内容:

面试理解


8. 锁状态如何变化

变化链路

无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁

1. 无锁

2. 偏向锁

3. 轻量级锁

4. 重量级锁

面试结论


9. 什么是 CAS

全称Compare And Swap

一句话:CAS 是一种无锁并发的原子操作,先比较内存中的当前值是否等于预期值,如果相等就更新,否则失败重试。

三个核心参数

执行逻辑

优势

问题

常见使用处


10. 自旋为什么能提升性能

一句话:当锁持有时间很短时,让线程先短暂空转等待,比直接阻塞和唤醒线程的系统开销更低。

为什么阻塞成本高

自旋适合什么场景

什么时候反而不好


11. 重量级锁里的 Monitor 是什么

一句话Monitor 是 JVM 在重量级锁阶段用来管理互斥、阻塞和线程协作的监视器对象。

Monitor 负责什么

面试理解


12. wait()notify()notifyAll() 是谁的方法

所属类

为什么设计在 Object

语义

使用要求

实际开发如何看


13. ReentrantReadWriteLock 读写锁

严格来说读写锁不是 ReentrantLock 本身的方法,而是同一套显式锁体系里的 ReentrantReadWriteLock

两把锁

规则

适用场景

使用价值

注意点


14. ReentrantLockCondition

一句话ConditionReentrantLock 提供的条件队列机制,用于替代 wait/notify,并支持一个锁绑定多个等待队列。

常用方法

wait/notify 的对应关系

为什么更灵活

使用注意


15. 公平锁是什么,还有哪些锁

公平锁

非公平锁

ReentrantLock 默认策略

常见锁分类


16. 这轮面试的高频速记版

多线程基础

线程安全

锁与并发工具

JVM 锁原理

面试答题建议