Lock 方法里的自旋逻辑会将 Mutex 的 Woken位 置为1。
```go
if !awoke && old&mutexWoken == 0 && old>>mutexWaiterShift != 0 &&
atomic.CompareAndSwapInt32(&m.state, old, old|mutexWoken) {
awoke = true
}
```
但是 Unlock 方法里会在 Woken 位 =1 时 return(不唤醒等待队列中的协程)
```go
if old>>mutexWaiterShift == 0 || old&(mutexLocked|mutexWoken|mutexStarving) != 0 {
return
}
```
在一些严苛的情景下,比如持续有新的协程走自旋逻辑去维持 Woken位为1,那等待队列中的协程就永远不会被唤醒了。。。
有没有大佬来一起讨论下
有疑问加站长微信联系(非本文作者)