Mutex
type Mutex struct{
state int32 // 表示当前互斥锁的状态
sema uint32 // 控制锁状态的信号量
}
state

state 字段一共 8 个字节,最低三位分别表示三个状态
- locked: 表示互斥锁的状态
- woken:表示从正常模式被唤醒
- starving:当前的互斥锁进入饥饿状态
- waitersCount: 在当前
互斥锁的公平性
互斥锁可以处于两种操作模式:正常模式和饥饿模式。
在正常模式下,等待者按照先进先出(FIFO)的顺序排队,但是被唤醒的等待者并不拥有互斥锁,而是需要与新到达的goroutine竞争锁的所有权。新到达的goroutine有优势——它们已经在CPU上运行,并且可能有很多,所以被唤醒的等待者很有可能会输掉。在这种情况下,它会被重新排在等待队列的前面。如果等待者尝试获取互斥锁超过1ms都失败了,它就会将互斥锁切换到饥饿模式。
在饥饿模式下,互斥锁的所有权直接从解锁的goroutine交给队列前面的等待者。
新到达的goroutine即使看到互斥锁似乎是解锁的,也不会尝试去获取它,也不会尝试自旋。相反,他们会将自己排在等待队列的尾部。
如果一个等待者接收到了互斥锁的所有权,并且看到要么
(1)它是队列中的最后一个等待者,或者(2)它等待的时间少于1ms,
它会将互斥锁切换回正常操作模式。
正常模式的性能要好得多,因为一个goroutine即使在有等待者被阻塞的情况下也可以连续多次获取互斥锁。
饥饿模式对于防止尾部延迟的病理情况非常重要。


