自学内容网 自学内容网

【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 类型来实现互斥锁。以下是互斥锁的基本使用方法:

  1. 导入 sync 包。
  2. 创建一个 Mutex 实例。
  3. 在访问共享资源之前调用 Lock() 方法。
  4. 在访问结束后调用 Unlock()
    方法。
  5. 使用 defer 关键字确保在函数退出时自动解锁。

💪无人扶我青云志,我自踏雪至山巅。
在这里插入图片描述


原文地址:https://blog.csdn.net/qq_42476938/article/details/143688758

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!