package main
import (
"fmt"
"sync"
)
// 互斥锁,跨多个协程安全访问数据
type Container struct {
m sync.Mutex // 同步状态
counters map[string]int
}
func (c *Container) inc(name string) {
// 先锁住状态,接收counters值并计算后再解锁。
fmt.Println("lock")
c.m.Lock() // 1
defer c.m.Unlock() // 3 延迟解锁,等待执行counters累加后最后才执行
fmt.Println("unlock")
c.counters[name]++ // 2
}
func main() {
c := Container{
counters: map[string]int{"a": 0, "b": 0},
}
var wg sync.WaitGroup
doIncrement := func(name string, n int) {
fmt.Printf("inc %s\n", name)
for i := 0; i < n; i++ {
c.inc(name)
}
fmt.Printf("%s done\n", name)
wg.Done()
}
wg.Add(3) // 开启三个go协程来并发处理任务
go doIncrement("a", 1000)
go doIncrement("a", 1000)
go doIncrement("b", 1000)
wg.Wait()
fmt.Println(c.counters)
}
go-基础-互斥锁-mutexes
最新推荐文章于 2024-07-18 20:36:39 发布