一、正常模式
在正常模式下,锁的等待会按照先进先出的顺序获的,但是刚刚被唤起的 Goroutine
会与新创建的 Goroutine
竞争,此时大概率会获取不到锁,为了减少这种情况的出现,一旦 Goroutine
超过 1ms
没有获取到锁,此时就会切换到饥饿模式。
二、饥饿模式
饥饿模式锁为了保证互斥锁的公平性,饥饿模式中会把锁交给等待队列最前面的 Goroutine。在该状态下,新的 Goroutine 无法获取锁,也不会进入自旋状态,即会在等待队列末尾等待。
当等待队列末尾的 Goroutine 获取到锁,或者 Goroutine 的等待时间少于 1ms 时,将从新切换到正常模式。
三、总结
与饥饿模式相比,正常模式下的互斥锁能提供更好的性能;饥饿模式能够避免 Goroutine 饿死,从而保证互斥锁的公平性。