golang中map的并发问题(golang中的sync.map)

本文探讨了Go语言中并发访问map时遇到的问题,由于map在扩容过程中可能导致数据不一致,Go语言禁止并发读写。为解决此问题,文章介绍了sync.map的实现原理,包括其内部结构、读写流程、追加数据、删除操作等,阐述了sync.map如何通过分离读写和扩容来确保并发安全性。
摘要由CSDN通过智能技术生成

 

        在这个程序中,我们对map进行了并发的读和写,并且读和写的值并不一样,按照我们正常的逻辑来说,这个并发程序并没有问题,但是运行后却会发现出错了。 错误显示的是对map进行了并发的读和写。

         为什么会出现这种问题呢?在map的扩容(具体的扩容过程自行百度)中,会产生新桶并且会逐步的删除旧桶,在并发的读写map时极易导致程序读到已删除的旧桶,go的创始人预见了这种情况,所以严格的限制了对map的并发读写。那么有没有办法解决这种情况呢?也有,最简单的办法就是在读写的时候加锁,但是这样在并发量大的情况下会严重影响运行速度。

        这时就可以用到sync.map了。这边我们来看一下sync.map的源码,在sync包中的map.go中。

type Map struct {
   mu Mutex

   // read contains the portion of the map's contents that are safe for
   // concurrent access (with or without mu held).
   //
   // The read field itself is always safe to load, but must only be stored with
   // mu held.
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值