Go面试题更新 2026-08-05

请解释Go语言中sync.Mutex的两种工作模式:正常模式和饥饿模式,它们分别是什么,以及各自的行为特点是什么?

技术原理Go

考察说明

考查对Go并发原语Mutex内部调度机制的理解,尤其是公平性设计。

回答思路

  1. 【回答框架 1】正常模式是Mutex的默认模式,基于自旋与阻塞结合的方式。当锁被释放时,新到达的goroutine会优先尝试自旋获取锁,如果有幸抢到,则直接运行,这可能导致等待队列中的goroutine饥饿。
  2. 【回答框架 2】饥饿模式是为了解决等待超过1毫秒的goroutine长期得不到锁的问题。进入饥饿模式后,锁在释放时会直接交给等待队列中的第一个goroutine,新到达的goroutine不再自旋,而是排队等待,保证公平性。
  3. 【回答框架 3】两种模式之间的切换:当等待队列中存在等待超过1毫秒的goroutine时,Mutex会从正常模式切换到饥饿模式;当等待队列清空或没有超过1毫秒的等待者时,会从饥饿模式切回正常模式。
  4. 【关键点 1】正常模式性能和吞吐量更高,但可能导致部分goroutine饥饿。
  5. 【关键点 2】饥饿模式牺牲了一定的性能,但保证了等待时间较长的goroutine能获得锁,提升了公平性。
  6. 【关键点 3】Mutex的公平性是基于等待时间阈值(1ms)动态调整的。
  7. 【易错点 1】误以为正常模式总是公平的,实际上正常模式是新老goroutine竞争的。
  8. 【易错点 2】饥饿模式不是完全公平,只在满足条件时切换,不是每把锁都采用饥饿模式。
  9. 【易错点 3】在Go 1.8及之前版本中,Mutex仅支持正常模式,说法不能一概而论。