并发下数据竞争的疑问,谢谢
lun-go opened this issue · comments
Register后,会启动下面的两个goroutine,其中涉及到对 map结构 collectDataMap map[string]*reportData的读写操作,想问的是为什么在读写这个map的时候不需要锁结构呢?谢谢
- go client.scheduleTask() 这个goroutine会遍历 collectDataMap 这个map结构
- go client.collect() 这个goroutine会读写 collectDataMap 这个map结构
很抱歉,刚注意到,如果我有说错,或者写错的地方,知道请帮我指出来,很感谢。
go提倡以channel来通信,而非使用共享内存(锁即为共享内存的方式),可以看到在reporter.go中,每一条上报数据都是往channel传送的(可以把channel理解为队列),在collector.go中,则是忠实而有序地对每条数据进行处理,处理完一条才会进行下一条,所以本身并不存在竞争关系,也就无须加锁了。