Go语言——sync.Map详解 sync.Map是1.9才推荐go语言如何建map的并发安全go语言如何建map的mapgo语言如何建map,除了互斥量以外,还运用了原子操作,所以在这之前,有必要了解下 Go语言——原子操作
go1.10\src\sync\map.go
entry分为三种情况go语言如何建map:
从read中读取key , 如果key存在就tryStore 。
注意这里开始需要加锁,因为需要操作dirty 。
条目在read中,首先取消标记,然后将条目保存到dirty里 。(因为标记的数据不在dirty里)
最后原子保存value到条目里面,这里注意read和dirty都有条目 。
总结一下Storego语言如何建map:
这里可以看到dirty保存了数据的修改 , 除非可以直接原子更新read,继续保持read clean 。
有了之前的经验,可以猜测下load流程:
与猜测的 区别 :
由于数据保存两份 , 所以删除考虑:
先看第二种情况 。加锁直接删除dirty数据 。思考下貌似没什么问题,本身就是脏数据 。
第一种和第三种情况唯一的区别就是条目是否被标记 。标记代表删除,所以直接返回 。否则CAS操作置为nil 。这里总感觉少点什么 , 因为条目其实还是存在的,虽然指针nil 。
看了一圈貌似没找到标记的逻辑,因为删除只是将他变成nil 。
之前以为这个逻辑就是简单的将为标记的条目拷贝给dirty,现在看来大有文章 。
【go语言如何建map go语言syncmap】 p == nil,说明条目已经被delete了,CAS将他置为标记删除 。然后这个条目就不会保存在dirty里面 。
这里其实就跟miss逻辑串起来了,因为miss达到阈值之后,dirty会全量变成read , 也就是说标记删除在这一步最终删除 。这个还是很巧妙的 。
真正的删除逻辑:
很绕 。。。。
golang hashmap的使用及实现 由于go语言是一个强类型的语言go语言如何建map,因此hashmap也是有类型的,具体体现在key和value都必须指定类型,比如声明一个key为string,value也是string的map,
需要这样做
大部分类型都能做key,某些类型是不能的 , 共同的特点是go语言如何建map: 不能使用== 来比较 , 包括: slice, map, function
在迭代的过程中是可以对map进行删除和更新操作的,规则如下:
golang的map是hash结构的,意味着平均访问时间是O(1)的 。同传统的hashmap一样,由一个个bucket组成:
那go语言如何建map我们怎么访问到对应的bucket呢,我们需要得到对应key的hash值
各个参数的意思:
目前采用的是这一行:
| 6.50 | 20.90 | 10.79 | 4.25 | 6.50 |
golang map源码浅析 golang 中 map的实现结构为: 哈希表 + 链表 。其中链表,作用是当发生hash冲突时,拉链法生成的结点 。
可以看到,[]bmap是一个hash table , 每一个 bmap是我们常说的“桶” 。经过hash 函数计算出来相同的hash值,放到相同的桶中 。一个 bmap中可以存放 8个 元素,如果多出8个,则生成新的结点,尾接到队尾 。
以上是只是静态文件 src/runtime/map.go 中的定义 。实际上编译期间会给它加料 ,动态地创建一个新的结构:
上图就是 bmap的内存模型, HOB Hash指的就是 top hash 。注意到 key 和 value 是各自放在一起的,并不是key/value/key/value/...这样的形式 。源码里说明这样的好处是在某些情况下可以省略掉 padding 字段,节省内存空间 。
每个 bmap设计成 最多只能放 8 个 key-value 对,如果有第 9 个 key-value 落入当前的 bmap,那就需要再构建一个 bmap,通过overflow指针连接起来 。
map创建方法:
我们实际上是通过调用的makemap,来创建map的 。实际工作只是初始化了hmap中的各种字段,如:设置B的大?。?设置hash 种子 hash 0.
推荐阅读
- 华为手环4兼容鸿蒙系统吗,用华为手环4需要下载什么软件
- 怎么手机遥控自家网络,如何手机遥控家里wifi
- postgresql11分区,pgsql 分区
- 模拟美女养成手机游戏,模拟美女养成手机游戏
- c语言求分段函数y的值 c语言中计算分段函数
- redis安装失败server2008,redis无法安装
- 在日本比较火的网络游戏,日本最火的游戏排行榜
- vb.net获取注册表 vbs 注册表
- 硬盘重新分区怎么找回来,硬盘重新分区是什么意思