Golang Sync.Map
Go sync.Map source from : https://mp.weixin.qq.com/s/8aufz1IzElaYR43ccuwMyA
在之前的 《爲什麼 Go map 和 slice 是非線程安全的?》 文章中,我們討論了 Go 語言的 map 和 slice 非線程安全的問題,基於此引申出了 map 的兩種目前在業界使用的最多的併發支持的模式。
分別是:
標準庫 sync.Map(Go1.9 及以後) 原生 map + 互斥鎖或讀寫鎖 mutex sync.Map 優勢 在 Go 官方文檔中明確指出 Map 類型的一些建議: https://pkg.go.dev/sync#Map 多個 goroutine 的併發使用是安全的,不需要額外的鎖定或協調控制。 大多數代碼應該使用原生的 map,而不是單獨的鎖定或協調控制,以獲得更好的類型安全性和維護性。 同時 Map 類型,還針對以下場景進行了性能優化:
當一個給定的鍵的條目只被寫入一次但被多次讀取時。例如在僅會增長的緩存中,就會有這種業務場景。 當多個 goroutines 讀取、寫入和覆蓋不相干的鍵集合的條目時。 這兩種情況與 Go map 搭配單獨的 Mutex 或 RWMutex 相比較,使用 Map 類型可以大大減少鎖的爭奪。
性能測試 聽官方文檔介紹了一堆好處後,他並沒有講到缺點,所說的性能優化後的優勢又是否真實可信。我們一起來驗證一下。
首先我們定義基本的數據結構:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 // 代表互斥鎖 type FooMap struct { sync.