日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Go 語言為什么不支持并發讀寫 map?

來源: 責編: 時間:2024-01-02 09:29:55 240觀看
導讀01 、介紹在 Go 語言項目開發中,我們經常會使用哈希表 map,它的時間復雜度是 O(1),Go 語言中的 map 使用開放尋址法避免哈希碰撞。Go 語言中的 map 并非原子操作,不支持并發讀寫操作。Go 官方認為 map 在大多數情況下是使

01 、介紹

在 Go 語言項目開發中,我們經常會使用哈希表 map,它的時間復雜度是 O(1),Go 語言中的 map 使用開放尋址法避免哈希碰撞。7PM28資訊網——每日最新資訊28at.com

Go 語言中的 map 并非原子操作,不支持并發讀寫操作。7PM28資訊網——每日最新資訊28at.com

Go 官方認為 map 在大多數情況下是使用 map 進行并發讀操作,僅在少數情況下是使用 map 進行并發讀寫操作。7PM28資訊網——每日最新資訊28at.com

如果 Go 語言中的 map 原生支持并發讀寫操作,在操作時需要先獲取互斥鎖,反而會降低只有并發讀操作時的性能。7PM28資訊網——每日最新資訊28at.com

在需要并發讀寫操作 map 時,可以結合 sync 包中的互斥鎖一起使用。7PM28資訊網——每日最新資訊28at.com

02 、并發讀寫 map

Go 支持并發讀 map,不支持并發讀寫 map。7PM28資訊網——每日最新資訊28at.com

示例代碼:7PM28資訊網——每日最新資訊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)}

輸出結果:7PM28資訊網——每日最新資訊28at.com

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

閱讀上面這段代碼,我們并發讀寫 map 類型的變量 m,在運行時,返回致命錯誤 fatal error: concurrent map read and map write。7PM28資訊網——每日最新資訊28at.com

Go 語言中的 map 在運行時是怎么檢測到 map 的存在寫操作?7PM28資訊網——每日最新資訊28at.com

源碼:7PM28資訊網——每日最新資訊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 是否為寫入狀態。7PM28資訊網——每日最新資訊28at.com

在訪問 map 時,通過判斷 hmap.flags 和 hashWriting 的值,可知是否有其它 goroutine 訪問 map,如果有,則返回致命錯誤 fatal("concurrent map writes")。7PM28資訊網——每日最新資訊28at.com

03 、總結

本文介紹 Go 語言為什么不支持并發讀寫 map,Go 官方的說法是在多數情況下 map 只存在并發讀操作,如果原生支持并發讀寫,即降低了并發讀操作的性能。7PM28資訊網——每日最新資訊28at.com

通過閱讀源碼,我們了解到在運行時檢測是否存在其它 goroutine 對 map 的寫操作,如果存在,則返回致命錯誤。7PM28資訊網——每日最新資訊28at.com

讀者朋友們在使用 map 時,要特別注意是否存在對 map 的并發寫操作,如果存在,要結合 sync 包的互斥鎖一起使用。7PM28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-55047-0.htmlGo 語言為什么不支持并發讀寫 map?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 大模型應用設計與實現指南,你學會了嗎?

下一篇: Kubernetes CRD & Operator 簡介

標簽:
  • 熱門焦點
  • Find N3入網:最高支持16+1TB

    OPPO將于近期登場的Find N3折疊屏目前已經正式入網,型號為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • 影音體驗是真的強 簡單聊聊iQOO Pad

    大公司的好處就是產品線豐富,非常細分化的東西也能給你做出來,例如早先我們看到了新的vivo Pad2,之后我們又在iQOO Neo8 Pro的發布會上看到了iQOO的首款平板產品iQOO Pad。雖
  • JavaScript學習 -AES加密算法

    引言在當今數字化時代,前端應用程序扮演著重要角色,用戶的敏感數據經常在前端進行加密和解密操作。然而,這樣的操作在網絡傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數據
  • 阿里大調整

    來源:產品劉有媒體報道稱,近期淘寶天貓集團啟動了近年來最大的人力制度改革,涉及員工績效、層級體系等多個核心事項,目前已形成一個初步的“征求意見版”:1、取消P序列
  • 華為HarmonyOS 4升級計劃公布:首批34款機型今日開啟公測

    8月4日消息,今天下午華為正式發布了HarmonyOS 4系統,在更流暢的前提下,還帶來了不少新功能,UI設計也有變化,會讓手機煥然一新。華為宣布,首批機型將會在
  • 三星Galaxy Z Fold5官方渲染圖曝光:13.4mm折疊厚度依舊感人

    據官方此前宣布,三星將于7月26日在韓國首爾舉辦Unpacked活動,屆時將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy Z Flip 5、
  • iQOO 11S屏幕細節公布:首發三星2K E6全感屏 安卓最好的直屏手機

    日前iQOO手機官方宣布,新一代電競旗艦iQOO 11S將會在7月4日19:00正式與大家見面。隨著發布時間的日益臨近,官方關于該機的預熱也更加密集,截至目前已
  • 榮耀Magicbook V 14 2021曙光藍版本正式開售,擁有觸摸屏

    榮耀 Magicbook V 14 2021 曙光藍版本正式開售,搭載 i7-11390H 處理器與 MX450 顯卡,配備 16GB 內存與 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 鍵盤鍵程、
  • 微軟發布Windows 11新版 引入全新任務欄狀態

    近日,微軟發布了Windows 11新版,而Build 22563更新主要引入了幾周前曝光的平板模式任務欄等,系統更流暢了。更新中,Windows 11加入了專門針對平板優化的任務欄
Top 主站蜘蛛池模板: 万盛区| 桐乡市| 蓝山县| 晋宁县| 绥芬河市| 河源市| 云霄县| 海盐县| 舟曲县| 安西县| 辉南县| 铅山县| 金溪县| 肃宁县| 大城县| 绥芬河市| 隆昌县| 仁怀市| 封开县| 南木林县| 台东市| 塔城市| 凤山县| 封丘县| 黄梅县| 如东县| 邵东县| 宣武区| 电白县| 金寨县| 永仁县| 惠来县| 乌兰浩特市| 灯塔市| 青阳县| 惠来县| 和田县| 洮南市| 丽江市| 永福县| 出国|