← 返回
408

锁、同步与互斥

首发 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 和重试成本。

专题路径

相关文章