Go 语言中的正常模式和饥饿模式

2023-04-09 01:57:54 阅读:1050 评论:0 点赞:0

一、正常模式

在正常模式下,锁的等待会按照先进先出的顺序获的,但是刚刚被唤起的 Goroutine 会与新创建的 Goroutine 竞争,此时大概率会获取不到锁,为了减少这种情况的出现,一旦 Goroutine 超过 1ms 没有获取到锁,此时就会切换到饥饿模式。
744fcbe6-470d-4692-a384-2299b596a3e4

二、饥饿模式

饥饿模式锁为了保证互斥锁的公平性,饥饿模式中会把锁交给等待队列最前面的 Goroutine。在该状态下,新的 Goroutine 无法获取锁,也不会进入自旋状态,即会在等待队列末尾等待。

当等待队列末尾的 Goroutine 获取到锁,或者 Goroutine 的等待时间少于 1ms 时,将从新切换到正常模式。

三、总结

与饥饿模式相比,正常模式下的互斥锁能提供更好的性能;饥饿模式能够避免 Goroutine 饿死,从而保证互斥锁的公平性。

附录

参考原文《Go语言设计与实现》

永不言弃

职业:后端开发工程师
学校:重庆师范大学
城市:重庆
文章:169
好吧,不知道说点什么...

登录逐梦笔记

注册逐梦笔记

已有账号?