golang互斥锁 sync.Mutex

阿斯顿法 · · 331 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

golang互斥锁 sync.Mutex

先看一段代码

package main

import (
    "fmt"
    "sync"
)

var x int
var wg sync.WaitGroup

func f1() {
    for i := 0; i < 20000; i++ {
        x++
    }
    wg.Done()
}

func main() {
    wg.Add(2)
    go f1()
    go f1()
    wg.Wait()
    fmt.Println(x)
}
E:\go\src\learngolang\00test>00test.exe
38289

E:\go\src\learngolang\00test>00test.exe
39420

E:\go\src\learngolang\00test>00test.exe
37269

我们执行几次看到其实返回的x值是不固定的,因为,两个goroutine并行执行,都会对x的值做出读写操作,导致了换乱。这时我们可以对x加一个互斥锁,保证同时只有一个goroutine可以访问 共享变量(临界区)。

var mutex sync.Mutex

修改一下 f1()

func f1() {
    for i := 0; i < 20000; i++ {
        mutex.Lock()    // 所在goroutine获得互斥锁之后,会阻塞其他goroutine对临界区的访问
         x++             // Lock与Unlock直接的代码段叫临界区,惯例来说,被保护的变量应该再Lock()之后立即声明
        mutex.Unlock()  // goroutine在结束后释放锁是必要的,无论以哪条路径通过函数都需要释放,即使是在错误路径中,也要记得释放。
    }
    wg.Done()
}

再执行几下看看

E:\go\src\learngolang\00test>go build 

E:\go\src\learngolang\00test>00test.exe
40000

E:\go\src\learngolang\00test>00test.exe
40000

E:\go\src\learngolang\00test>00test.exe
40000

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:阿斯顿法

查看原文:golang互斥锁 sync.Mutex

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

331 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传