在 Go 中,Mutex 的饥饿模式是指某些 goroutine 在争用锁时一直无法获得锁的情况。这种情况下,这些 goroutine 会一直等待并且不断尝试获取锁,而其他 goroutine 则有机会获取锁。
Mutex 的饥饿模式通常发生在高并发场景中,当许多 goroutine 同时争用同一个 Mutex 时。为了防止出现饥饿模式,Go 中的 Mutex 实现使用了两个级别的优先级:正常和饥饿。
当一个 Mutex 上发生过长时间的争用时,它将进入到“饥饿模式”。此时,Mutex 将仅考虑那些已经等待很久但仍没有成功获取到锁的 goroutine。它们将优先于新来的 goroutine 获得锁,并且也不会允许更多新来的 goroutine 进入等待队列。
换句话说,在 Mutex 进入“饥饿模式”之后,只有等待时间最长、最需要这个锁的那些 goroutine 才能获得锁。其他较短等待时间或较低需求程度的 goroutine 可能永远都无法获得这个锁。
因此,在实际开发中应该避免 Mutex 的长时间争用以及饥饿模式的出现,以确保所有 goroutine 都能公平地获得锁。