Go使用sync.Map來解決map的並發操作問題
前言
在 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使用sync.Map來解決map的並發操作問題的文章就介紹到這瞭,更多相關Go sync.Map解決map並發操作內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- go sync.Map基本原理深入解析
- Go語言中map使用和並發安全詳解
- golang coroutine 的等待與死鎖用法
- 詳解Go語言中Goroutine退出機制的原理及使用
- golang 並發編程之生產者消費者詳解