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

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

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

01 、介绍

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

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

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

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

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

02 、并发读写 map

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

示例代码:2S728资讯网——每日最新资讯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)}

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

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

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

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

源码:2S728资讯网——每日最新资讯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 是否为写入状态。2S728资讯网——每日最新资讯28at.com

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

03 、总结

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

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

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

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

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

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

下一篇: JetBrains 发布 2023 年 C# 开发者主要趋势

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 2023 年的 Node.js 生态系统

    随着技术的不断演进和创新,Node.js 在 2023 年达到了一个新的高度。Node.js 拥有一个庞大的生态系统,可以帮助开发人员更快地实现复杂的应用。本文就来看看 Node.js 最新的生
  • 多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • 三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对“势”的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • 新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的“新电商三兄弟”成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • 半导体需求下滑 三星电子DS业务部门今年营业亏损预计超10万亿韩元

    7月17日消息,据外媒报道,去年下半年开始的半导体需求下滑,影响到了三星电子、SK海力士、英特尔等诸多厂商,营收明显下滑,部分厂商甚至出现了亏损。作为
  • 超级标准版旗舰!iQOO 11S全球首发iQOO超算独显芯片

    上半年已接近尾声,截至目前各大品牌旗下的顶级旗舰都已悉数亮相,而下半年即将推出的顶级旗舰已经成为了数码圈爆料的主流,其中就包括全新的iQOO 11S系
  • AI艺术欣赏体验会在上海梅赛德斯奔驰中心音乐俱乐部上演

    光影交错的镜像世界,虚实幻化的视觉奇观,虚拟偶像与真人共同主持,这些场景都出现在2019世界人工智能大会的舞台上。8月29日至31日,“AI艺术欣赏体验会”在上海
Top