go语言的sync.map源码学习

  1. amended标识read里数据是否已被复制到dirty
  2. dirty存储map里所有的数据,只有当miss次数>=dirty长度了,才会把read的m字段指向dirty数据,同时清空dirty,设置amended为false.
  3. 查询时read里查到值的话:返回时判断是否是nil或expunged,是的话就返回nil,不是的话就返回值。
  4. 查询时read里没查到的话:返回的就是dirty里查的
  5. 删除时read里查到值的话:删除只是把val置为nil,后续将read复制到dirty的时候,会将val置为expunged.
  6. 删除时read里没查到值的话:删除是在dirty里删除的。
  7. 插入时read里查到的话就通过cas操作直接赋值。
  8. 插入时read里没有的话就会加锁,然后再次从read里读取,此时read里有的话会判断val是否是expunged,是的话则将expunged通过cas操作赋值为nil并把要插入的kv插入到dirty中。不是expunged的话则直接原子性赋值。read里没有dirty里查到的话,直接通过原子性操作更改值。read里没有dirty里也没有的话,先判断read是否被复制到dirty里过,如果没有的话则先将read里非nil和非expunged的kv复制到dirty里(此过程会同时将read里的v为nil的都换成expunged,标识此k在dirty不存在,且dirty不为nil.),然后想dirty里插入此kv对。


k就是代码里的key,v就是代码里的value

  • Load方法:

func (m *Map) Load(key interface{}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值