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

相关阅读 >>

Golang 适合做web开发吗

Go语言中Goto的用法是什么

Golang如何获取目录下文件是否存在

Go - 实现项目内链路追踪(二)

手撸Golang 结构型设计模式 享元模式

10天入门Go语言教程- 常量变量

手撸Golang etcd raft协议之7

2021-02-22

关于 Golang 字符串 格式化

Golang 实现 rsa 的加密解密

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




打赏

取消

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

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

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

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

评论

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