锁
互斥锁
- 解释:互斥锁,保证同一时刻只有 1 个 goroutine 访问共享资源,比如多个协程同时修改同一个文件,同一时刻只能同一个协程进行修改
- 使用方法
| |
| |
| var guardMutex sync.Mutex |
| |
| |
| guardMutex.Lock() |
| |
| |
| guardMutex.Unlock() |
- 实际demo
| package main |
| |
| import ( |
| "fmt" |
| "sync" |
| ) |
| |
| |
| type SumStruct struct { |
| value int |
| wg sync.WaitGroup |
| } |
| |
| |
| type CountStruct struct { |
| value int |
| wg sync.WaitGroup |
| mu sync.Mutex |
| } |
| |
| func main() { |
| var sum int |
| |
| |
| |
| |
| sum = sumUseMutex() |
| fmt.Printf("最终sum的值 = %d\n", sum) |
| } |
| |
| |
| func sumNoMutex() int { |
| sumStruct := SumStruct{} |
| |
| |
| sumStruct.wg.Add(5) |
| for i := 1; i <= 5; i++ { |
| go func(w *sync.WaitGroup) { |
| defer w.Done() |
| for j := 0; j < 100; j++ { |
| sumStruct.value = sumStruct.value + 1 |
| } |
| }(&sumStruct.wg) |
| } |
| |
| |
| sumStruct.wg.Wait() |
| |
| return sumStruct.value |
| } |
| |
| |
| func sumUseMutex() int { |
| countStruct := CountStruct{} |
| countStruct.wg.Add(5) |
| |
| |
| for i := 0; i < 5; i++ { |
| go func(cs *CountStruct) { |
| defer cs.wg.Done() |
| for j := 0; j < 1000; j++ { |
| cs.add() |
| } |
| }(&countStruct) |
| } |
| |
| |
| countStruct.wg.Wait() |
| sum := countStruct.getValue() |
| return sum |
| } |
| |
| |
| func (c *CountStruct) add() { |
| |
| c.mu.Lock() |
| defer c.mu.Unlock() |
| c.value++ |
| } |
| |
| |
| func (c *CountStruct) getValue() int { |
| c.mu.Lock() |
| defer c.mu.Unlock() |
| return c.value |
| } |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话