golang互斥锁 sync.Mutex


本文摘自网络,作者,侵删。

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

相关阅读 >>

22 Golang中的接口(二)

Golang学习之旅——解开心中的Go mod疑惑

通过 wasmedge 嵌入webassembly 函数扩展 Golang 应用

Golang可以写web吗?

Golang的gc

nginx 服务搭建

Go语言实现定时器的方法是什么

Golana语言社区】window应该开发之--cmd杀进程

20 Golang中使用第三方包

聊聊dubbo-Go-proxy的discoveryservice

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...