go语言sync.Mutex

发布时间 2023-04-18 12:14:34作者: 每天提醒自己要学习

go语言sync.mutex

数据结构

type Mutex struct {
	state int32
	sema  uint32
}

Mutex包含了两个字段,分别是state、sema,state表示了当前锁的状态,sema是用于控制锁的一个信号量。这是一个零值可用的结构体,零值表示未加锁

state 字段的最低三位表示三种状态,分别是 mutexLocked mutexWoken mutexStarving ,剩下的用于统计当前在等待锁的 goroutine 数量

  • mutexLocked 表示是否处于锁定状态
  • mutexWoken 表示是否处于唤醒状态
  • mutexStarving 表示是否处于饥饿状态
  • waiterShift 表示等待的goroutine数量

Lock

func (m *Mutex) Lock() {
	// Fast path: grab unlocked mutex.
	if atomic.CompareAndSwapInt32(&m.state, 0, mutexLocked) {
        // 用于辅助race检测器进行手动竞态检查
		if race.Enabled {
			race.Acquire(unsafe.Pointer(m))
		}
		return
	}
	// Slow path (outlined so that the fast path can be inlined)
	m.lockSlow()
}

Lock方法首先进行了一次cas操作,尝试将state的值从0改为1,代表首次进行加锁,如果成功直接返回,若是不成功,将调用lockSlow方法进行加锁。