互斥锁正常模式和饥饿模式有什么区别 ?

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

  1. 正常模式:在正常模式下,等待队列中的goroutine不会直接从持有锁的goroutine中接过锁,而是将锁放回到队列中,所有等待的goroutine都有机会获取到锁。这种方式是公平的,但会导致频繁的goroutine切换,进而导致性能开销。

  2. 饥饿模式:在饥饿模式下,锁会直接从持有锁的goroutine传递给等待队列中的下一个goroutine。如果有goroutine等待了超过1ms并且还没能获取锁,那么锁就会进入饥饿模式。在饥饿模式下,新来的goroutine即使看到锁是解锁的,也不会去尝试获取锁,而是放在等待队列的尾部。

这两种模式在Go的sync.Mutex中是自动切换的。当锁处于饥饿模式,且有goroutine等待了超过1ms,或者等待队列中没有goroutine时,锁会切换回正常模式。

简单来说,正常模式更公平但可能引发性能问题,而饥饿模式可能导致某些goroutine等待时间过长,但可以避免频繁的goroutine切换,从而提高性能。

发表评论

后才能评论