锁、同步与互斥
首发 2026/05/28
阅读 0
评论 0
更新 2026/05/28
锁、同步与互斥
1. 一句话总结
锁保护共享资源;互斥解决同一时刻只能一个线程进入临界区,同步解决多个线程按条件协作。
2. 通俗解释
多线程改同一个变量像多人同时改一份表格。锁是进入表格前先拿钥匙,CAS 像提交前检查版本号有没有变。
3. 核心概念
- 临界区:访问共享资源的代码区域。
- 互斥锁:同一时间只允许一个线程进入。
- 自旋锁:拿不到锁时循环等待。
- 读写锁:多读共享,写者独占。
- 信号量/条件变量:线程间同步。
- CAS:比较并交换的原子操作。
4. 底层原理
- 竞态条件来自共享状态读写顺序不确定。
- 互斥锁等待时可能阻塞并上下文切换。
- 自旋锁避免睡眠唤醒,但长等待浪费 CPU。
- 读写锁适合读多写少。
- CAS 依赖硬件原子指令,但有 ABA 和重试成本。
5. 面试标准回答
锁和同步机制用于保证多线程访问共享资源时结果正确。临界区是访问共享变量或共享对象的代码区域,互斥锁保证同一时刻只有一个线程进入临界区。自旋锁在拿不到锁时持续尝试,适合锁持有时间很短的场景;互斥锁在等待较久时会让线程阻塞,减少 CPU 空转。读写锁允许多个读线程同时访问,但写线程独占,适合读多写少。CAS 可实现无锁结构,但要注意 ABA 问题和失败重试成本。
6. 高频追问
追问 1:锁、同步与互斥面试第一句话怎么答?
先给结论:临界区:访问共享资源的代码区域。 再补充它解决的问题和使用场景,避免一上来背长定义。
追问 2:它为什么需要底层机制支撑?
竞态条件来自共享状态读写顺序不确定。 面试官追问时要把“现象”落到“机制”和“代价”。
追问 3:常见误区是什么?
不要把平均情况说成绝对结论,也不要忽略边界条件、退化情况和工程成本。
追问 4:如果继续追问怎么展开?
可以沿着“定义 → 原理 → 对比 → 场景 → 缺点 → 优化”展开,重点说清:互斥锁等待时可能阻塞并上下文切换。
追问 5:实际开发中怎么体现?
Java synchronized、ReentrantLock、Atomic 都围绕锁和 CAS。 这类联系能把基础知识从“背概念”变成“解释工程选择”。
追问 6:回答时怎么收尾?
最后用一句话总结适用条件和代价,说明什么时候该用、什么时候不该用。
7. 易混淆点
| 易混点 | 正确理解 | 面试提醒 |
|---|---|---|
| 互斥 | 限制同时访问 | 重点是排他 |
| 同步 | 控制执行顺序 | 重点是协作 |
| 自旋锁 | 不阻塞但耗 CPU | 适合短临界区 |
| 读写锁 | 读共享写独占 | 读多写少才划算 |
| CAS | 硬件原子操作 | 不是没有成本 |
8. 实际开发联系
- Java synchronized、ReentrantLock、Atomic 都围绕锁和 CAS。
- Redis 单线程模型减少共享数据锁竞争。
- 数据库事务锁解决并发读写一致性。
9. 背诵速记
锁保护共享资源。互斥锁排他,自旋锁适合短等待但耗 CPU,读写锁适合读多写少,CAS 实现无锁更新但有 ABA 和重试成本。
专题路径
上一篇
进程调度与上下文切换
下一篇
死锁