文章目录 一、总结 二、源码 (一)Mutex (二)Lock (三)Unlock 三、常见问题 1. sema 字段的含义作用 2. 什么是CAS,什么是原子操作 3. 锁的正常模式和饥饿模式? 4. 为什么锁不可复制 5. 什么情况下mutex会从饥饿模式变成正常模式呢? 6. goroutine能进入自旋的条件 一、总结 锁不可复制:拷贝互斥锁同时会拷贝锁的状态,容易造成死锁 不是可重入锁,并且一个协程上锁,可以由另外一个协程解锁 mutex 锁结构 state:32位,锁状态,bitmap 设计, 1 mutexLocked :低1位 锁定状态 2 mutexWoken :低2位,从正常模式被唤醒 3 mutexStarving 是低3位,进入饥饿模式 4.mutexWaiterShift 剩下 29 位,当前互斥锁上等待者的数量 sema:协程等待信号量,用于控制goroutine的阻塞与唤醒 上锁 解锁