请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

sync.Mutex正常模式和饥饿模式的区别

如果一个等待的Goroutine获取到锁并达到下面2个条件中任意一个时,就会将锁切换到饥饿模式:
当前队列只剩下一个 goroutine 时;
当一个 goroutine 等待锁时间超过 1ms时;

当前队列只剩下一个 goroutine 时,代表后面没有等待的goroutine。应该是切换到正常模式吧

正在回答 回答被采纳积分+3

1回答

少林码僧 2024-03-21 22:46:07

首先要理解饥饿模式的目的是什么,

饥饿模式的目的是为了解决了等待 goroutine 队列的长尾问题。饥饿模式下,直接由 unlock 把锁交给等待队列中排在第一位的 goroutine (队 头),同时,饥饿模式下,新进来的 goroutine 不会参与抢锁也不会进入自旋状 态,会直接进入等待队列的尾部。这样很好的解决了老的 goroutine一直抢不 到锁的场景。


第一个条件,当一个 goroutine 等待锁的时间超过了 1 毫秒,说明它可能一直在争抢锁,但由于其他更快的 goroutine 不断地抢占锁,导致这个 goroutine 一直未能获取到锁。在这种情况下,启用饥饿模式可以确保这个 goroutine 能够更快地获得锁,并避免长时间等待。这样可以降低长尾延迟,提高系统的整体响应速度。

第二个条件,当等待队列中只剩下一个 goroutine 时,启用饥饿模式有利于公平性。在这种情况下,新到达的 goroutine 不会立即抢占锁,而是加入到等待队列的尾部。这样可以确保先到达的 goroutine 更早地获取到锁,避免了不公平的竞争


0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信