golang之race

由于golang中的go是非常方便的,加上函数又非常容易隐藏go。
所以很多时候,当我们写出一个程序的时候,我们并不知道这个程序在并发情况下会不会出现什么问题。

所以在本质上说,goroutine的使用增加了函数的危险系数。比如一个全局变量或公共变量,如果没有加上锁,我们写一个比较庞大的项目下来,就根本不知道这个变量是不是会引起多个goroutine竞争

看一下下面的例子,思考下val变量是否需要加锁?

package main
 
import(
    "fmt"
    "time"
)
 
func main() {
    val := 1
    go func(){
        val = 2
    }()
    val = 3
    fmt.Println("val:",val)
 
    for{
        time.Sleep(time.Second)
    }
}

结果:
在这里插入图片描述
这个命令输出了Warning,告诉我们,goroutine7运行到第110行和main goroutine运行到第112行的时候触发竞争了。
而且goroutine7是在第109行的时候产生的。

结论:go run - race *.go 命令可以帮助检查代码是否遗漏的加锁,竞争检测。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值