### 1. 设计要点 - 提供互斥,能否阻止多个线程进入临界区 - 公平性,·锁释放时需要确保每个线程都有同等概率获得锁,不会有线程出现饿死的情况 - 性能消耗 ### 2. 锁早期设计方法 - 在进临界区前关闭中断 - 在出临界区后打开中断 - 优点:设计简单,中断控制线程切换,中断关闭,一个线程会持续运行到结束 - 缺点: - 要求每个运行的线程都可以对中断进行开关,风险较高,容易被恶意调用,造成死机 - 不适用于多处理器,中断只能关闭一个,线程可以在其他处理器上继续运行 - 中断丢失,丢失部分设备的中断信号 - 性能低,现代处理器,对中断的开关代码执行较慢 ### 3. 迭代-自旋锁 - 通过 LoadAndStore命令实现 - 返回旧值,设置新值,原子操作 - 线程会不断自旋,可能多个线程一直都在自旋 - 自旋期间,单处理器系统,浪费大量时间片 image-20230821200141278 ### 4. 迭代-比较并交换 - CompareAndSwap ![image-20230905112738473](https://blog-heysq-1255479807.cos.ap-beijing.myqcloud.com/blog/note/image-20230905112738473.png) ### 5. 自旋,立刻让出CPU,休眠+队列减轻线程在等待锁时的消耗 - 自旋,一直循环判断锁,浪费CPU时间中断 - 立刻让出CPU,线程没有获取到锁时,主动让出锁,可能会持续获取不到锁造成饥饿现象 - 休眠和队列组合使用,可以唤醒指定线程 ### 6. 两阶段锁 - 先自旋 - 后休眠