Go语言sync。Map
Go语言中的 map 在并发情况下,只读是线程安全的,同时读写是线程不安全的。
如果想实现并发线程安全有两种方法: map加互斥锁或读写锁 标准库sync.map(Go1.19+新特性) sync.map源码
https://github.com/golang/go/blob/master/src/sync/map.go sync.map 实现原理及优化利用map只读不用锁,通过冗余 read 和 dirty 两个字段将读写分离,读的数据存在只读字段 read 上,将最新写入的数据则存在 dirty 字段上,只在dirty读写上加锁,提高程序只读效率。 读取时会先查询 read,不存在再查询 dirty,写入时则只写入 dirty 读取 read 并不需要加锁,而读或写 dirty 都需要加锁 另外有 misses 字段来统计 read 被穿透的次数(被穿透只需要读 dirty 的情况),超过一定次数则将 dirty 数据同步到 read 上 对于删除数据则直接通过标记来延迟删除
具体数据结构可参考:
https://blog.csdn.net/u010853261/article/details/103848666
https://www.haohongfan.com/docs/gohandbook/sync-chapter/2021-05-10-sync-map/ sync.map 使用场景
map+Mutex: 通过Mutex互斥锁来实现多个goroutine对map的串行化访问,读写都需要通过Mutex加锁和释放锁,适用于读写比接近的场景
map+RWMutex:通过RWMutex来实现对map的读写进行读写锁分离加锁,从而实现读的并发性能提高,同Mutex相比适用于读多写少的场景
sync.Map:底层通分离读写map和原子指令来实现读的近似无锁,并通过延迟更新的方式来保证读的无锁化。读多修改少,元素增加删除频率不高的情况,在大多数情况下替代上述两种实现 sync.map 使用方法如下package main import ( "fmt" "sync" ) func main() { var m sync.Map //添加一个元素 m.Store(1, "a") m.Store("a", 2) //读取一个元素 fmt.Println(m.Load(1)) //a true fmt.Println(m.Load("a")) //2 true //读取不存在的元素 fmt.Println(m.Load(2)) // false //存在就返回,不存在就插入 fmt.Println(m.LoadOrStore("3", 33)) //33 false fmt.Println(m.Load("3")) //33 true //如果存在的话,同时删除这个 key fmt.Println(m.LoadAndDelete("3")) // 33 true //删除某个元素 m.Delete("3") // 遍历所有sync.Map中的键值对 m.Range(func(k, v interface{}) bool { fmt.Println("iterate:", k, v) return true }) }
通过以上示例可以看到sync.map具有以下特性: 可以存储不同的数据类型在一起,这有别于map只能存储声明好的数据类型,且相同的。 无须初始化,直接声明即可。 sync.Map 不能使用map的方式进行取值和设置等操作,而是使用 sync.Map 的方法进行调用,Store 表示存储,Load 表示获取,Delete 表示删除 增加了两个特殊方法LoadOrStore 存在就返回,不存在就插入,LoadAndDelete 如果存在的话,同时删除这个 key 使用 Range 配合一个回调函数进行遍历操作,通过回调函数返回内部遍历出来的值,Range 参数中回调函数的返回值在需要继续迭代遍历时,返回 true,终止迭代遍历时,返回 false。 参考资料
https://juejin.cn/post/6844904100287496206
https://pkg.go.dev/sync#Map
https://blog.csdn.net/u010853261/article/details/103848666
https://medium.com/@deckarep/the-new-kid-in-town-gos-sync-map-de24a6bf7c2c
https://www.haohongfan.com/docs/gohandbook/sync-chapter/2021-05-10-sync-map/
今天起,这些新规开始执行律回春晖渐,万象始更新。新的一年开启新的征程,也带来了新的变化新的利好新的希望。2023年1月1日起,一系列汽车行业相关的新政策新规范新举措开始实施,不仅会对汽车产业带来新的影响,
梅宏院士操作系统存在20年周期律,泛在操作系统时代已来当今世界正在进行一场大范围深层次的科技革命和产业变革。从社会经济层面来看,数字化转型正成为时代趋势。数字经济作为一种新经济形态,正处于成型展开期。中国科学院院士梅宏在2022操作系
疑似五菱缤果内饰谍照曝光,复古风格,定位小型纯电动车日前,GO车君从相关渠道获取到了一组五菱缤果的内饰谍照。新车定位为纯电动小型车,将采用五门四座的设计。从目前曝光的内饰谍照可以看到,新车仅配备了一块液晶仪表,而液晶中控屏可能将作为
资本论第三章货币或商品流通第三节货币(C。世界货币)货币超越一个国家的流通领域,便失去了在这个领域内获得的价格标准铸币辅币价值符号的功能,贵金属块又取代了以上功能。在世界贸易中,需要一种共同认同的货币形式,作为商品独立的价值形态所表
年度汇总关于数码产品,要带什么到2023?真的是2022年最后一天才出来的内容,很多内容来不及出来。2022年就过去了,一共就做了112个项目,不多吧,但是就我个人单兵作战来看,也挺多了,不怕,对得起自己,下一年,玩点特别
大毛刷的6厘米牛仔裤搭配短袖上衣,董洁街头实力走秀!说到大明星董洁,估计大家也都非常的熟悉了,首先我们大家都知道董洁也算是一位实力派的大美女了,出道这么多年以来,董洁凭借自己出色的颜值和气质赢得了大多数网友的偏爱,而且董洁也出演了很
扬州何园景区贴窗花送祝福迎新年今天是新年第一天,扬州何园景区开展迎新年贴窗花送祝福活动,何家千金身穿古装,通过剪窗花贴窗花等民俗活动,为游客送上节日的祝福,庆祝元旦佳节的到来。剪纸窗花是中国古老的汉族传统民间艺
夜游黄鹤楼许心愿迎新年夜上黄鹤楼民俗游园活动,游客们在乐韵灯影中跨入2023年。长江日报记者何晓刚摄长江日报讯(记者叶飞艳通讯员江朝)昨晚,千年名楼黄鹤楼作为武汉城市地标,以国潮国风游园形式展现传统文化
可爱兔兔来了!奢侈品齐过中国新年封面新闻记者吴雨佳一年一度的中国传统新年将至,又到奢侈品品牌集中首发年度限量新品的季节。今年是可可爱爱的兔年,全球奢侈品大牌们纷纷在中国电商平台上首发兔年限定新春系列。记者了解到,
新年求进,阿里对内动刀,张勇亲自接管云业务在2022年即将结束的时候,腾讯京东都相继向外界发声,对内动刀子。这样的变革决心之强,让马化腾和刘强东都毫不留情的放了重话,没给高层留什么颜面。另一边的互联网巨头阿里,不显山不露水
新年换新手机指南4商务旗舰手机当选心系天下三星W23如果说到商务气息最为浓郁的手机产品,大概不少人都会想到三星的心系天下系列。作为三星与中国电信联合推出的高端商务旗舰,心系天下已经推出了十五年,在高端领域算是有口皆碑。与往代不同,今