因为之前博主碰到过一个笔试题,里面就有提到data race数据竞争,之前没听过这个概念,所以就特地去了解了一下
1.首先在golang中使用data race竞争工具,需要去环境变量中设置CGO_ENABLED="1"才能使用
2.开启后便可以直接使用,先把加锁代码注释
var (
tempSlice []string // Server维护的数据结构
lock sync.Mutex //互斥锁
)
func main() {
for i := 0; i < 10; i++ {
go Server(strconv.Itoa(i))
}
time.Sleep(time.Second)
}
func Server(str string) {
// 因为slice在golang中不是并发安全,所以使用Mutex实现并发安全
//lock.Lock()
tempSlice = append(tempSlice, str)
fmt.Println("这是第", str,"次请求:",tempSlice)
//lock.Unlock()
}
这段代码,10个协程同时去动态添加切片,肯定会有并发安全问题,在命令行直接执行go run -race main.go就可以进行数据竞争检测
3.当我们把加锁代码注释取消后再次执行
以上就是一个针对数据竞争非常简单的例子