golang学习(2)-> 锁的使用(mutex的深入探讨)

330 阅读1分钟

前言 上篇文章我们介绍了同步原语mutex的使用和注意事项,本章主要介绍mutex的原理以及其是如何实现并发的。

mutex的使用

mutex的数据结构

翠花上代码

type Mutex struct {
	state int32
	sema  uint32
}

Mutex的结构体很简单 只有两个字段state和sema state为0代表当前未锁定的互斥锁,也就是说当前的共享数据存在并发的可能性。sema是用于控制锁状态的信号量

互斥锁的状态

翠花上图片:

mutexLocked 代表互斥锁的锁定状态

mutexToken 表示互斥锁唤醒状态

mutexStarving 表示互斥锁进入饥饿状态

waitersCount 表示还有多少协程竞争锁

mutex的方法

翠花上代码:

type Locker interface {
	Lock()
	Unlock()
}

mutex的锁定和解锁非常简单只有两个方法,Lock和Unlock

情况说明

  1. 如果对已经加锁的共享变量进行加锁则会阻塞到解锁

  2. 如果对未加锁的变量进行解锁,则会发生panic。如下示例:

	m := sync.Mutex{}
	m.Unlock()
	num := 0
	fmt.Println("=====", num)d

总结:

本章主要是对mutex的进一步学习,其实mutex的代码很适合用来阅读源码,结构和使用都很简单。

最后:

如果有需要可以关注老王的公众号:

宇宇独行