- amended标识read里数据是否已被复制到dirty
- dirty存储map里所有的数据,只有当miss次数>=dirty长度了,才会把read的m字段指向dirty数据,同时清空dirty,设置amended为false.
- 查询时read里查到值的话:返回时判断是否是nil或expunged,是的话就返回nil,不是的话就返回值。
- 查询时read里没查到的话:返回的就是dirty里查的
- 删除时read里查到值的话:删除只是把val置为nil,后续将read复制到dirty的时候,会将val置为expunged.
- 删除时read里没查到值的话:删除是在dirty里删除的。
- 插入时read里查到的话就通过cas操作直接赋值。
- 插入时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{}