当前位置:首页 > 科技  > 软件

Go 语言为什么不支持并发读写 map?

来源: 责编: 时间:2024-01-02 09:29:55 318观看
导读01 、介绍在 Go 语言项目开发中,我们经常会使用哈希表 map,它的时间复杂度是 O(1),Go 语言中的 map 使用开放寻址法避免哈希碰撞。Go 语言中的 map 并非原子操作,不支持并发读写操作。Go 官方认为 map 在大多数情况下是使

01 、介绍

在 Go 语言项目开发中,我们经常会使用哈希表 map,它的时间复杂度是 O(1),Go 语言中的 map 使用开放寻址法避免哈希碰撞。vNO28资讯网——每日最新资讯28at.com

Go 语言中的 map 并非原子操作,不支持并发读写操作。vNO28资讯网——每日最新资讯28at.com

Go 官方认为 map 在大多数情况下是使用 map 进行并发读操作,仅在少数情况下是使用 map 进行并发读写操作。vNO28资讯网——每日最新资讯28at.com

如果 Go 语言中的 map 原生支持并发读写操作,在操作时需要先获取互斥锁,反而会降低只有并发读操作时的性能。vNO28资讯网——每日最新资讯28at.com

在需要并发读写操作 map 时,可以结合 sync 包中的互斥锁一起使用。vNO28资讯网——每日最新资讯28at.com

02 、并发读写 map

Go 支持并发读 map,不支持并发读写 map。vNO28资讯网——每日最新资讯28at.com

示例代码:vNO28资讯网——每日最新资讯28at.com

func main() { var m = make(map[int]string) go func() {  for {   m[1] = "xx"  } }() go func() {  for {   _ = m[1]  } }() time.Sleep(time.Second * 3)}

输出结果:vNO28资讯网——每日最新资讯28at.com

fatal error: concurrent map read and map write// ...

阅读上面这段代码,我们并发读写 map 类型的变量 m,在运行时,返回致命错误 fatal error: concurrent map read and map write。vNO28资讯网——每日最新资讯28at.com

Go 语言中的 map 在运行时是怎么检测到 map 的存在写操作?vNO28资讯网——每日最新资讯28at.com

源码:vNO28资讯网——每日最新资讯28at.com

const ( // flags iterator     = 1 // there may be an iterator using buckets oldIterator  = 2 // there may be an iterator using oldbuckets hashWriting  = 4 // a goroutine is writing to the map sameSizeGrow = 8 // the current map growth is to a new map of the same size)// A header for a Go map.type hmap struct { count     int // # live cells == size of map.  Must be first (used by len() builtin) flags     uint8 B         uint8  // log_2 of # of buckets (can hold up to loadFactor * 2^B items) noverflow uint16 // approximate number of overflow buckets; see incrnoverflow for details hash0     uint32 // hash seed buckets    unsafe.Pointer // array of 2^B Buckets. may be nil if count==0. oldbuckets unsafe.Pointer // previous bucket array of half the size, non-nil only when growing nevacuate  uintptr        // progress counter for evacuation (buckets less than this have been evacuated) extra *mapextra // optional fields}// Like mapaccess, but allocates a slot for the key if it is not present in the map.func mapassign(t *maptype, h *hmap, key unsafe.Pointer) unsafe.Pointer { // ...done: if h.flags&hashWriting == 0 {  fatal("concurrent map writes") } h.flags &^= hashWriting if t.IndirectElem() {  elem = *((*unsafe.Pointer)(elem)) } return elem}

阅读上面这段源码,我们可以发现在 hmap 结构体中的字段 flags,该字段用于标记 map 是否为写入状态。vNO28资讯网——每日最新资讯28at.com

在访问 map 时,通过判断 hmap.flags 和 hashWriting 的值,可知是否有其它 goroutine 访问 map,如果有,则返回致命错误 fatal("concurrent map writes")。vNO28资讯网——每日最新资讯28at.com

03 、总结

本文介绍 Go 语言为什么不支持并发读写 map,Go 官方的说法是在多数情况下 map 只存在并发读操作,如果原生支持并发读写,即降低了并发读操作的性能。vNO28资讯网——每日最新资讯28at.com

通过阅读源码,我们了解到在运行时检测是否存在其它 goroutine 对 map 的写操作,如果存在,则返回致命错误。vNO28资讯网——每日最新资讯28at.com

读者朋友们在使用 map 时,要特别注意是否存在对 map 的并发写操作,如果存在,要结合 sync 包的互斥锁一起使用。vNO28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-55047-0.htmlGo 语言为什么不支持并发读写 map?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 大模型应用设计与实现指南,你学会了吗?

下一篇: Kubernetes CRD & Operator 简介

标签:
  • 热门焦点
  • 中兴AX5400Pro+上手体验:再升级 双2.5G网口+USB 3.0这次全都有

    2021年11月的时候,中兴先后发布了两款路由器产品,中兴AX5400和中兴AX5400 Pro,从产品命名上就不难看出这是隶属于同一系列的,但在外观设计上这两款产品可以说是完全没一点关系
  • 7月安卓手机好评榜:三星S23Ultra好评率第一

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年7月1日至7月31日,仅限国内市场。第一名:三星Galaxy S23 Ultra好评率:95.71%在即将迎来新
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • 学习JavaScript的10个理由...

    作者 | Simplilearn编译 | 王瑞平当你决心学习一门语言的时候,很难选择到底应该学习哪一门,常用的语言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    记者丨宁晓敏 见习生丨汗青出品丨鳌头财经(theSankei) 前不久,爱奇艺发布了一份亮眼的一季报,不仅营收和会员营收创造历史最佳表现,其运营利润也连续6个月实现增长。自去年年初
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 郭明錤称华为和江淮汽车合作开发问界MPV,定价100万左右、计划明年量产

    8 月 1 日消息,郭明錤今天在 Medium 平台发布博文,称华为正在和江淮汽车合作,开发售价在 100 万元的问界 MPV,预计在 2024 年第 2 季度量产,销量目标为
  • 苹果MacBook Pro 2021测试:仍不支持平滑滚动

    据10月30日9to5 Mac 消息报道,苹果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后获得了不错的评价,亮点包括行业领先的性能,令人印象深刻的电池续航,精美丰
Top