Go 语言的 在设计上为了平衡性能(吞吐量)和公平性,实现了两种模式:正常模式(Normal Mode)和饥饿模式(Starvation Mode)。 这两种模式是自动切换的,以下是详细对比: --- 1. 正常模式 (Normal Mode) 这是 Mutex 的默认模式,主要为了性能优化。 工作机制: 当一个 Goroutine 释放锁时,它会唤醒等待队列(FIFO)头部的 Goroutine。 关键点(抢占): 被唤醒的 Goroutine 不会直接拥有锁,而是需要和新来的 Goroutine 竞争。 新来的优势: 新来的 Goroutine 正在 CPU 上运行(处于活跃状态),而刚被唤醒的 Goroutine 需要上下文切换(从睡眠中醒来)。因此,新来的 Goroutine 往往能抢到锁。 自旋(Spinning): 新来的 Goroutine 如果发现锁被占用,会尝试“自旋”(空转 CPU 等待一小会儿),如果在这期间锁释放了,它就能立刻拿到,避免了昂贵的系统调用和上下文切换。 优点: 吞吐量极高。减少了 Goroutine 的上下文切换和系统调用开销。 缺点: 不公...