go map 并发写的问题
資深大佬 : yujianwjj 6
场景是多个 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
现在有两个问题:
- 为什么 count 为 5000 就报错,100 的时候不报错。
- 多个 goroutine 对 map 只写不读的场景有什么效率更高的方式。
大佬有話說 (30)