亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

go中普通map和sync.map的區(qū)別小結(jié)

 更新時(shí)間:2025年09月30日 09:16:03   作者:{?■_■}  
本文主要介紹了go中普通map和sync.map的區(qū)別小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1. 普通map的特點(diǎn)

Go 內(nèi)置的 map非并發(fā)安全的:

  • 單協(xié)程里讀寫(xiě)沒(méi)問(wèn)題;
  • 多協(xié)程同時(shí)寫(xiě)會(huì)觸發(fā) fatal error: concurrent map writes
  • 多協(xié)程并發(fā)讀寫(xiě)需要自己加鎖(如 sync.RWMutex)。

源碼層面(runtime/map.go):

  • map 內(nèi)部通過(guò) hmap 結(jié)構(gòu)體存儲(chǔ)桶(buckets)管理數(shù)據(jù);
  • 設(shè)計(jì)目標(biāo)是高性能單線程
  • 并沒(méi)有加鎖邏輯。

2.sync.Map的特點(diǎn)

Go 在 1.9+ 引入了 sync.Map,為高并發(fā)場(chǎng)景做了專(zhuān)門(mén)優(yōu)化。
特點(diǎn):

  • 并發(fā)安全,內(nèi)部已經(jīng)封裝了鎖;
  • 針對(duì)讀多寫(xiě)少的場(chǎng)景做了特別優(yōu)化(類(lèi)似“讀寫(xiě)分離”)。

源碼層面(sync/map.go):

type Map struct {
    mu Mutex               // 寫(xiě)操作用的鎖
    read atomic.Value      // 存儲(chǔ)只讀部分,原子讀
    dirty map[any]*entry   // 可寫(xiě)部分,寫(xiě)時(shí)更新
    misses int             // 記錄從 read 讀取失敗的次數(shù)
}

核心機(jī)制:

  • 雙 map 設(shè)計(jì)

    • read(只讀,atomic.Value):無(wú)鎖讀,性能高;
    • dirty(寫(xiě)緩沖,受鎖保護(hù)):存儲(chǔ)新增/修改的數(shù)據(jù);
  • 寫(xiě)時(shí)遷移策略:當(dāng) read 中 miss 次數(shù)過(guò)多,會(huì)把 dirty 提升為 read

  • 保證讀快寫(xiě)慢的同時(shí),整體高并發(fā)安全。

通過(guò)readdirty分別存儲(chǔ)讀寫(xiě)狀態(tài),以空間換時(shí)間的策略,去減少鎖沖突。

3. 舉個(gè)對(duì)比例子

// 普通 map + 鎖
var m = make(map[string]int)
var mu sync.RWMutex

func safeWrite(k string, v int) {
    mu.Lock()
    defer mu.Unlock()
    m[k] = v
}

func safeRead(k string) (int, bool) {
    mu.RLock()
    defer mu.RUnlock()
    v, ok := m[k]
    return v, ok
}

sync.Map 相比:

  • 普通 map+RWMutex寫(xiě)性能更好,適合頻繁寫(xiě);
  • sync.Map讀性能更好,適合讀多寫(xiě)少。

4. 面試回答

普通 map 是非并發(fā)安全的,需要開(kāi)發(fā)者手動(dòng)用 sync.RWMutex 保證線程安全。
sync.Map 內(nèi)部采用 讀寫(xiě)分離(read + dirty) 的雙 map 設(shè)計(jì),讀操作可以無(wú)鎖原子讀,寫(xiě)操作用鎖保護(hù),并在一定 miss 次數(shù)后把 dirty 提升為 read。
適用場(chǎng)景不同:

  • sync.Map:讀多寫(xiě)少,典型場(chǎng)景如緩存、配置表;
  • map+RWMutex:寫(xiě)多的場(chǎng)景更優(yōu)。

到此這篇關(guān)于go中普通map和sync.map的區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)go中普通map和sync.map內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang內(nèi)存對(duì)齊的概念及案例詳解

    golang內(nèi)存對(duì)齊的概念及案例詳解

    為保證程序順利高效的運(yùn)行,編譯器會(huì)把各種類(lèi)型的數(shù)據(jù)安排到合適的地址,并占用合適的長(zhǎng)度,這就是內(nèi)存對(duì)齊。本文重點(diǎn)給大家介紹golang內(nèi)存對(duì)齊的概念及案例詳解,感興趣的朋友一起看看吧
    2022-02-02
  • go nil處理如何正確返回nil的error

    go nil處理如何正確返回nil的error

    這篇文章主要為大家介紹了go中的nil處理,如何正確返回nil的error實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • go判斷文件夾是否存在并創(chuàng)建的實(shí)例

    go判斷文件夾是否存在并創(chuàng)建的實(shí)例

    這篇文章主要介紹了go判斷文件夾是否存在,并創(chuàng)建的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • golang json性能分析詳解

    golang json性能分析詳解

    json格式可以算我們?nèi)粘W畛S玫男蛄谢袷街涣?,Go語(yǔ)言作為一個(gè)由Google開(kāi)發(fā),號(hào)稱(chēng)互聯(lián)網(wǎng)的C語(yǔ)言的語(yǔ)言,自然也對(duì)JSON格式支持很好。下面這篇文章主要給大家詳細(xì)分析介紹了golang json性能的相關(guān)資料,需要的朋友可以參考下。
    2018-02-02
  • go內(nèi)存緩存如何new一個(gè)bigcache對(duì)象示例詳解

    go內(nèi)存緩存如何new一個(gè)bigcache對(duì)象示例詳解

    這篇文章主要為大家介紹了go內(nèi)存緩存如何new一個(gè)bigcache對(duì)象示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • GO 之運(yùn)算符號(hào)的具體使用

    GO 之運(yùn)算符號(hào)的具體使用

    這篇文章主要介紹了GO運(yùn)算符號(hào)的具體使用,包括算術(shù)、一元、關(guān)系、邏輯、位運(yùn)算及賦值運(yùn)算符,感興趣的可以了解一下
    2025-06-06
  • go中如何獲取本機(jī)ip地址

    go中如何獲取本機(jī)ip地址

    這篇文章主要介紹了go中如何獲取本機(jī)ip地址問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Go調(diào)度器學(xué)習(xí)之協(xié)作與搶占詳解

    Go調(diào)度器學(xué)習(xí)之協(xié)作與搶占詳解

    如果某個(gè)G執(zhí)行時(shí)間過(guò)長(zhǎng),其他的G如何才能被正常調(diào)度,這就引出了接下來(lái)的話題:協(xié)作與搶占。本文將通過(guò)一些示例為大家詳細(xì)講講調(diào)度器中協(xié)作與搶占的相關(guān)知識(shí),需要的可以參考一下
    2023-04-04
  • go語(yǔ)言題解LeetCode1160拼寫(xiě)單詞示例詳解

    go語(yǔ)言題解LeetCode1160拼寫(xiě)單詞示例詳解

    這篇文章主要為大家介紹了go語(yǔ)言題解LeetCode1160拼寫(xiě)單詞示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Go語(yǔ)言fmt.Sprintf格式化輸出的語(yǔ)法與實(shí)例

    Go語(yǔ)言fmt.Sprintf格式化輸出的語(yǔ)法與實(shí)例

    Go 可以使用 fmt.Sprintf 來(lái)格式化字符串,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言fmt.Sprintf格式化輸出的語(yǔ)法與實(shí)例,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07

最新評(píng)論