Go-互斥锁的实现
Mutex 数据结构 1 2 3 4 type Mutex struct { state int32 sema uint32 } Mutex 使用过之后是不可被拷贝的 state 等于 0 值的时候才是无锁的状态 sema 字段为信号量字段,通过该字段控制协程的阻塞和唤醒,具体实现在runtime 中。 Mutex 对象总共有三个公开方法 Lock 尝试抢占互斥锁,如果已经被锁定,则调用协程进入阻塞 TryLock Unlock 解除互斥锁, 解锁未锁定的互斥锁会发生panic Mutex 与协程无法关,允许一个协程锁定,另一个协程进行解锁。 Mutex 实现了一个 sync.Locker 接口, 该接口只有两个方法 Lock Unlock Mutex 锁有几种状态 mutexLocked = 1 已经锁定 mutexWoken = 2 表示当前锁的等待队列,有协程正在活跃地获取锁,可以考虑不用释放信号量 mutexStarving = 4 当前锁已经进入了饥饿状态 其他常量 mutexWaiterShift = 3 统计的等待在Mutex.state字段等待数量。(前3位,用于表示锁的状态, 即 mutexLocked, mutexWoken, mutexStarving) starvationThresholdNs = 1e6 进入饥饿模式的阈值 1ms Mutex 锁的竞争方式 Mutex 锁有两种状态 ...