### 1. 设计要点

- 提供互斥，能否阻止多个线程进入临界区
- 公平性，·锁释放时需要确保每个线程都有同等概率获得锁，不会有线程出现饿死的情况
- 性能消耗

### 2. 锁早期设计方法

- 在进临界区前关闭中断
- 在出临界区后打开中断
- 优点：设计简单，中断控制线程切换，中断关闭，一个线程会持续运行到结束
- 缺点：
  - 要求每个运行的线程都可以对中断进行开关，风险较高，容易被恶意调用，造成死机
  - 不适用于多处理器，中断只能关闭一个，线程可以在其他处理器上继续运行
  - 中断丢失，丢失部分设备的中断信号
  - 性能低，现代处理器，对中断的开关代码执行较慢

### 3. 迭代-自旋锁

- 通过 LoadAndStore命令实现
- 返回旧值，设置新值，原子操作
- 线程会不断自旋，可能多个线程一直都在自旋
- 自旋期间，单处理器系统，浪费大量时间片

<img src="https://blog-heysq-1255479807.cos.ap-beijing.myqcloud.com/blog/note/image-20230821200141278.png" alt="image-20230821200141278" style="zoom:33%;" />

### 4. 迭代-比较并交换

- CompareAndSwap

  ![image-20230905112738473](https://blog-heysq-1255479807.cos.ap-beijing.myqcloud.com/blog/note/image-20230905112738473.png)

### 5. 自旋，立刻让出CPU，休眠+队列减轻线程在等待锁时的消耗

- 自旋，一直循环判断锁，浪费CPU时间中断
- 立刻让出CPU，线程没有获取到锁时，主动让出锁，可能会持续获取不到锁造成饥饿现象
- 休眠和队列组合使用，可以唤醒指定线程

### 6. 两阶段锁

- 先自旋
- 后休眠



