核心数据结构:sync.Mutex
type Mutex struct {
state int32 // 核心状态字段,包含了多个信息
sema uint32 // 信号量,用于阻塞和唤醒 Goroutine
}
关键在于这个 state 字段,它是一个 32 位的整数,通过位操作同时记录了四种状态:
| 比特位 | 含义 |
|---|---|
| 第 0 位 (mutexLocked) | 锁是否被持有:1 表示已锁定,0 表示未锁定。 |
| 第 1 位 (mutexWoken) | 是否有被唤醒的 Goroutine:1 表示已有 Goroutine 被唤醒,正在尝试获取锁。用于避免不必要的唤醒。 |
| 第 2 位 (mutexStarving) | 是否处于饥饿模式:1 表示饥饿模式。 |
| 第 3 位及以后 | 等待者的数量:当前阻塞在信号量上、等待锁的 Goroutine 的近似数量。 |


63

被折叠的 条评论
为什么被折叠?



