【go从零单排】Mutexes互斥锁
🌈Don’t worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。
📗概念
在 Go 语言中,互斥锁(Mutex)是一种用于保护共享资源的并发控制机制。它确保在同一时间只有一个 goroutine 可以访问特定的资源,从而避免数据竞争和不一致性。
💻代码
package main
//sync 提供了并发控制的工具,包括互斥锁和 WaitGroup。
import (
"fmt"
"sync"
)
type Container struct {
mu sync.Mutex // 互斥锁,用于保护共享资源
counters map[string]int // 存储计数的映射
}
func (c *Container) inc(name string) {
c.mu.Lock() // 加锁,确保互斥访问
defer c.mu.Unlock() // 在函数结束时解锁
c.counters[name]++ // 增加指定名称的计数
}
func main() {
//创建一个 Container 实例 c,并初始化计数器 counters。
c := Container{
counters: map[string]int{"a": 0, "b": 0}, // 初始化计数器
}
var wg sync.WaitGroup // 声明一个 WaitGroup
//doIncrement 函数用于在指定名称上增加计数 n 次
doIncrement := func(name string, n int) {
for i := 0; i < n; i++ {
c.inc(name) // 调用 inc 方法增加计数
}
wg.Done() // 当前 goroutine 完成时调用 Done
}
wg.Add(3) // 设置 WaitGroup 的计数为 3
go doIncrement("a", 10000) // 启动第一个 goroutine
go doIncrement("a", 10000) // 启动第二个 goroutine
go doIncrement("b", 10000) // 启动第三个 goroutine
wg.Wait() // 等待所有 goroutine 完成
fmt.Println(c.counters) // 打印最终的计数结果
}
//输出
//map[a:20000 b:10000]
🔍理解
- 互斥锁 是处理并发访问共享资源的有效工具,确保同一时间只有一个 goroutine 可以访问资源。
- 使用 Lock() 和 Unlock() 方法来管理访问,通常结合 defer 关键字使用,以确保在函数退出时自动解锁。
- 通过互斥锁,可以避免数据竞争和不一致性,确保程序的正确性。
互斥锁的基本用法
Go 的 sync 包提供了 Mutex 类型来实现互斥锁。以下是互斥锁的基本使用方法:
- 导入 sync 包。
- 创建一个 Mutex 实例。
- 在访问共享资源之前调用 Lock() 方法。
- 在访问结束后调用 Unlock()
方法。 - 使用 defer 关键字确保在函数退出时自动解锁。
💪无人扶我青云志,我自踏雪至山巅。
原文地址:https://blog.csdn.net/qq_42476938/article/details/143688758
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!