有效版本:
Golang >= 1.9,第四版解决饥饿模式的代码流程
描述:
可以看到,随着 Go Mutex 的一步步迭代,单看流程图都已经十分难以理解了,尤其是 Lock 流程图,为了画这张图看源码、看解析、搜资料整理了不下10个小时,反反复复改了七八版以上。
真的希望Go团队能重构一下这里的代码,已经基本不太可读了...
加锁 Lock 流程
从上述的图中,我们可以总结出以下几点:
- 如果锁当前没有被占有,那么一个CAS直接拿锁返回
- 在饥饿模式下,没有资格抢锁,会挂起等信号唤醒
- 在正常模式下,乐观预期只发生一次CAS更新状态,是依赖CAS前后状态变化来判断这次是否拿到了锁
- 在正常模式下,唤醒之后,会与后来者竞争,这时依然有可能触发自旋
- 在饥饿模式下,被唤醒了,代表锁交给你,会拿锁走人
解锁 Unlock 流程
解锁流程太清晰了,就不加解释了