😯go语言并发编程中,简单经典好用的就是Mutex,也就是go语言中的互斥,适用于比较初阶的go并发编程。
🚗🚗🚗🚗这边文章里面会介绍Mutex的两个经典使用方法。
系列文章目录
《7天学会Go并发编程》第一天 go并发实战初窥门径_大锤爱编程的博客-CSDN博客
《7天学会Go并发编程》の第二天 写一个简单的Go并发程序以及Goroutine的使用_大锤爱编程的博客-CSDN博客
《7天学会Go并发编程》第三天 go的Mutex使用_大锤爱编程的博客-CSDN博客
《7天学会Go并发编程》第四天 sync.Once和sync.WaitGroup学习应用实践_大锤爱编程的博客-CSDN博客
《7天学会Go并发编程》第五天 go语言Context的应用和实现 go实现超时判断_大锤爱编程的博客-CSDN博客
《7天学会Go并发编程》第六天 go语言Sync.cond的应用和实现 go实现多线程联合执行_大锤爱编程的博客-CSDN博客
《7天学会Go并发编程》第7天 go语言并发编程Atomic原子实战操作含ABA问题_大锤爱编程的博客-CSDN博客
目录
一、Mutex是什么
Mutex是go语言当中的互斥锁,作用是用来给临界区的数据加锁,保证一次只有一个goroutline可以对临界区资源访问修改。避免发生冲突。
这样:
二、🍻go语言Mutex经典编程案例
经典编程案例有两个:1、直接使用Mutex对临界区资源修改
2.1🍺🍺🍺 原生态并发计数
并发开启100个线程进行计数,使用mutex对关键代码进行加锁,确保每次只有一个线程对这个关键变量进行修改,避免多个线程同时这个关键代码进行操作。
func MutextExer() {
initValue := 0
group := sync.WaitGroup{}
mutex := sync.Mutex{}
for i := 0; i < 100; i++ {
group.Add(1)
go func(value *int) {
defer group.Done()
mutex.Lock()
for i := 0; i < 1000; i++ {
*value++
}
mutex.Unlock()
}(&initValue)
}
group.Wait()
fmt.Printf("The count value is %d", initValue)
}
代码对应结果:
2.2 🍭🍭🍭使用带锁结构体实现并发计数
加锁,使用mutex解决线程并发问题 。加锁通俗的说就是对资源上锁,拿到钥匙的人才能访问,控制住了钥匙,⚓️就能控制住访问顺序。
定义一个该结构体的接口,实现一个线程安全的参数累加。
结构体定义:
type count struct {
lock sync.Mutex
value int
}
//结构体对应的结构方法
func (receiver *count) countOne() {
receiver.lock.Lock()
defer receiver.lock.Unlock()
receiver.value++
}
下面实现累加对应实现:
带锁结构体的应用相对来说比较简单,实现一个对应的结构体带锁函数。带锁结构体初始化后,直接调用对应的线程安全函数就可以实现。
func StructMutex() {
c := count{
lock: sync.Mutex{},
value: 0,
}
group := sync.WaitGroup{}
for i := 0; i < 100; i++ {
group.Add(1)
go func(count2 *count) {
defer group.Done()
for i := 0; i < 1000; i++ {
count2.countOne()
}
}(&c)
}
group.Wait()
fmt.Printf("The count value is %d", c.value)
}
代码对应结果:
三、🍏🍏🍏总结
Mutex在go语言并发编程中是一个比较经典和关键的sync结构体。基本的使用方法如上所示:1、直接使用mutex包裹对应需要并发执行的代码 2、定义带锁结构体,实现对应的线程安全方法。结构体初始化后,直接调用对应的线程安全方法。💪🏻⛽️~
🧧🧧🧧感谢诸位大佬的阅读,点个关注,收藏一下呗~