sync.Map的使用问题

sync.Map的使用问题

课程中,曹大介绍了内置的map在并发的情况下会有问题。所以建议大家使用sync.Map。

今天在一个博客上看到说,sync.Map也是有一些问题的

  1. 它适合一次写入,多次共享读取的情况。我理解是如果有共享,但是多个goroutine同时写,也有潜在风险,sync.Map也是不合适的,对吧?

  2. sync.Map 用的是interface,所以还需要额外的对数据进行检查。

所以有些情况下,还是用sync.RWMutex来设置临界区的方式使用内置的map。

我们在第三课的作业中也实现了一个自己的并发安全的map版本,我就是用的mutex的方式实现的,而且我在源码 1.14.4中看到

```

type Map struct{

    ​mu Mutex

}

```​

其实也是有mutex互斥量的,我理解只要在写的时候mutex lock了。就是安全的,无论多写还是一次写多次读的情况


想听听曹大的教导

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
Xargin 2021-07-27 18:48:32
  1. 多个 writer 没有风险,内部会加锁,只是如果写并发高的情况下,sync.Map 的效率可能还不如普通的 map + RWMutex,这个可以通过自己构造代码压测来验证,也可以跑 parallel benchmark

  2. 并发安全问题可以通过 build -race 来构建出一个特殊版本,通过给服务发压,看看有没有 race 输出来检查是否有并发问题


之前课上我说建议用 sync.Map,主要是因为自己用 map 加锁,很容易写出没控制好临界区,导致死锁的代码


现在因为没有泛型,所以 sync.Map 的 api 全是用 interface,1.18 以后,这部分肯定会大改

  • 提问者 拧壶冲 #1
    所以其实sync.Map会更保险一些,即使效率没有map+RWrite锁高。但是可以自己练习,并通过压测对比提升改进。 谢谢曹大!!!
    2021-07-27 19:58:50
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师