sync.Mutex

数据结构

type Mutex struct {
	state int32     //互斥锁上锁状态枚举值如下所示
	sema  uint32    //信号量,向处于Gwaitting的G发送信号
}

const (
	mutexLocked = 1 << iota // 1 互斥锁是锁定的
	mutexWoken              // 2 唤醒锁
	mutexWaiterShift = iota // 2 统计阻塞在这个互斥锁上的goroutine数目需要移位的数值
)

互斥锁无冲突是最简单的情况了,有冲突时,首先进行自旋,因为大多数的Mutex保护的代码段都很短,经过短暂的自旋就可以获得;如果自旋等待无果,就只好通过信号量来让当前 goroutine 进入 Gwaitting 状态