场景是多个 goroutine 对一个 map 只写不读。
最开始用加锁的方式,来实现多个 goroutine 对一个 map 进行写入。后来发现效率有点低。就尝试了下不加锁的方式。
func TestMap(t *testing.T) {
a := map[string]int{}
count := 100
wg := sync.WaitGroup{}
wg.Add(count)
for i := 0; i < count; i++ {
go func(i int) {
a[fmt.Sprintf("%d", i)] = i
wg.Done()
}(i)
}
wg.Wait()
for k, v := range a {
fmt.Println(k, " ", v)
}
}
以上测试代码能够正常工作,并且写入的数据正确,我就以为 map 只写不读的情况是可以不加锁的。
但是实际场景中 count 为 5000,然后就报错了:
fatal error: concurrent map writes
现在有两个问题:
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.