blurooo / go-monitor

go-monitor是一个用于服务质量监控并实现分析告警的模块。

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

并发下数据竞争的疑问,谢谢

lun-go opened this issue · comments

Register后,会启动下面的两个goroutine,其中涉及到对 map结构 collectDataMap map[string]*reportData的读写操作,想问的是为什么在读写这个map的时候不需要锁结构呢?谢谢

  1. go client.scheduleTask() 这个goroutine会遍历 collectDataMap 这个map结构
  2. go client.collect() 这个goroutine会读写 collectDataMap 这个map结构

很抱歉,刚注意到,如果我有说错,或者写错的地方,知道请帮我指出来,很感谢。

go提倡以channel来通信,而非使用共享内存(锁即为共享内存的方式),可以看到在reporter.go中,每一条上报数据都是往channel传送的(可以把channel理解为队列),在collector.go中,则是忠实而有序地对每条数据进行处理,处理完一条才会进行下一条,所以本身并不存在竞争关系,也就无须加锁了。