有效版本:

Golang >= 1.9,第四版解决饥饿模式的代码流程

描述:

可以看到,随着 Go Mutex 的一步步迭代,单看流程图都已经十分难以理解了,尤其是 Lock 流程图,为了画这张图看源码、看解析、搜资料整理了不下10个小时,反反复复改了七八版以上。

真的希望Go团队能重构一下这里的代码,已经基本不太可读了...

加锁 Lock 流程


从上述的图中,我们可以总结出以下几点:

  1. 如果锁当前没有被占有,那么一个CAS直接拿锁返回
  2. 在饥饿模式下,没有资格抢锁,会挂起等信号唤醒
  3. 在正常模式下,乐观预期只发生一次CAS更新状态,是依赖CAS前后状态变化来判断这次是否拿到了锁
  4. 在正常模式下,唤醒之后,会与后来者竞争,这时依然有可能触发自旋
  5. 在饥饿模式下,被唤醒了,代表锁交给你,会拿锁走人

解锁 Unlock 流程

Unlock 流程


解锁流程太清晰了,就不加解释了