采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
如果一个等待的Goroutine获取到锁并达到下面2个条件中任意一个时,就会将锁切换到饥饿模式: 当前队列只剩下一个 goroutine 时; 当一个 goroutine 等待锁时间超过 1ms时;
当前队列只剩下一个 goroutine 时,代表后面没有等待的goroutine。应该是切换到正常模式吧
首先要理解饥饿模式的目的是什么,
饥饿模式的目的是为了解决了等待 goroutine 队列的长尾问题。饥饿模式下,直接由 unlock 把锁交给等待队列中排在第一位的 goroutine (队 头),同时,饥饿模式下,新进来的 goroutine 不会参与抢锁也不会进入自旋状 态,会直接进入等待队列的尾部。这样很好的解决了老的 goroutine一直抢不 到锁的场景。
第一个条件,当一个 goroutine 等待锁的时间超过了 1 毫秒,说明它可能一直在争抢锁,但由于其他更快的 goroutine 不断地抢占锁,导致这个 goroutine 一直未能获取到锁。在这种情况下,启用饥饿模式可以确保这个 goroutine 能够更快地获得锁,并避免长时间等待。这样可以降低长尾延迟,提高系统的整体响应速度。
第二个条件,当等待队列中只剩下一个 goroutine 时,启用饥饿模式有利于公平性。在这种情况下,新到达的 goroutine 不会立即抢占锁,而是加入到等待队列的尾部。这样可以确保先到达的 goroutine 更早地获取到锁,避免了不公平的竞争
登录后可查看更多问答,登录/注册
GO工程师面试与技能提升专题课程
185 6
102 5
278 5
155 4
314 3