Go - 使用 sync.Map 來解決 map 的併發操作問題
阿新 • • 發佈:2021-10-30
目錄
前言
在 Golang
中 map
不是併發安全的,自 1.9 才引入了 sync.Map
,sync.Map
的引入確實解決了 map
的併發安全問題,不過 sync.Map
卻沒有實現 len()
函式,如果想要計算 sync.Map
的長度,稍微有點麻煩,需要使用 Range
函式。
map 併發操作出現問題
func main() { demo := make(map[int]int) go func() { for j := 0; j < 1000; j++ { demo[j] = j } }() go func() { for j := 0; j < 1000; j++ { fmt.Println(demo[j]) } }() time.Sleep(time.Second * 1) }
執行輸出:
fatal error: concurrent map read and map write
sync.Map 解決併發操作問題
func main() {
demo := sync.Map{}
go func() {
for j := 0; j < 1000; j++ {
demo.Store(j, j)
}
}()
go func() {
for j := 0; j < 1000; j++ {
fmt.Println(demo.Load(j))
}
}()
time.Sleep(time.Second * 1)
}
執行輸出:
<nil> false 1 true ... 999 true
計算 map 長度
func main() {
demo := make(map[int]int)
for j := 0; j < 1000; j++ {
demo[j] = j
}
fmt.Println("len of demo:", len(demo))
}
執行輸出:
len of demo: 1000
計算 sync.Map 長度
func main() { demo := sync.Map{} for j := 0; j < 1000; j++ { demo.Store(j, j) } lens := 0 demo.Range(func(key, value interface{}) bool { lens++ return true }) fmt.Println("len of demo:", lens) }
執行輸出:
len of demo: 1000
小結
Load
載入 key 資料Store
更新或新增 key 資料Delete
刪除 key 資料Range
遍歷資料LoadOrStore
如果存在 key 資料則返回,反之則設定LoadAndDelete
如果存在 key 資料則刪除
以上,希望對你能夠有所幫助。
推薦閱讀
- Go - 基於逃逸分析來提升程式效能
- Go - 使用 sync.Pool 來減少 GC 壓力
- Go - 使用 options 設計模式
- Go - json.Unmarshal 遇到的小坑
- Go - 兩個在開發中需注意的小點
作者:新亮筆記(關注公眾號,可申請新增微信好友)
出處:https://www.cnblogs.com/xinliangcoder
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。