sync.Map的使用问题
课程中,曹大介绍了内置的map在并发的情况下会有问题。所以建议大家使用sync.Map。
今天在一个博客上看到说,sync.Map也是有一些问题的
它适合一次写入,多次共享读取的情况。我理解是如果有共享,但是多个goroutine同时写,也有潜在风险,sync.Map也是不合适的,对吧?
sync.Map 用的是interface,所以还需要额外的对数据进行检查。
所以有些情况下,还是用sync.RWMutex来设置临界区的方式使用内置的map。
我们在第三课的作业中也实现了一个自己的并发安全的map版本,我就是用的mutex的方式实现的,而且我在源码 1.14.4中看到
```
type Map struct{
mu Mutex
}
```
其实也是有mutex互斥量的,我理解只要在写的时候mutex lock了。就是安全的,无论多写还是一次写多次读的情况
想听听曹大的教导
正在回答 回答被采纳积分+1
多个 writer 没有风险,内部会加锁,只是如果写并发高的情况下,sync.Map 的效率可能还不如普通的 map + RWMutex,这个可以通过自己构造代码压测来验证,也可以跑 parallel benchmark
并发安全问题可以通过 build -race 来构建出一个特殊版本,通过给服务发压,看看有没有 race 输出来检查是否有并发问题
之前课上我说建议用 sync.Map,主要是因为自己用 map 加锁,很容易写出没控制好临界区,导致死锁的代码
现在因为没有泛型,所以 sync.Map 的 api 全是用 interface,1.18 以后,这部分肯定会大改
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星