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)
    }
}

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

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

你可能感兴趣的:(go,golang,go,race,go竞争检测)