Mutex 有哪几种模式?

在 Go 语言中,sync.Mutex 锁只有两种模式:正常模式和饥饿模式。

  1. 正常模式:这是 sync.Mutex 的默认模式。在此模式下,等待获取锁的 goroutines 会形成一个队列。当锁释放时,队列中的第一个 goroutine 不一定会获得锁,其他新到的 goroutines 也有可能先获得锁。这种情况可能导致某些 goroutines 长时间得不到锁,即产生 “饥饿” 现象。

  2. 饥饿模式:当一个 goroutine 等待锁超过一定的时间(目前是1ms)或者有等待的 goroutines 已经被唤醒,锁就会转入饥饿模式。在饥饿模式下,锁会直接交给等待队列中的第一个 goroutine,新到的 goroutines 即使在锁被释放的时候也不会尝试去获取锁,而是直接进入等待队列的尾部。

锁会自动从饥饿模式切换回正常模式,当锁被持有的时间很短或者等待队列中没有 goroutine 时,锁就会转回正常模式。

需要注意的是,Go语言的开发者通常不需要直接处理这两种模式,因为 sync.Mutex 会自动进行切换。

发表评论

后才能评论