1. 程式人生 > 其它 >Go - 使用 sync.Map 來解決 map 的併發操作問題

Go - 使用 sync.Map 來解決 map 的併發操作問題

目錄

前言

Golangmap 不是併發安全的,自 1.9 才引入了 sync.Mapsync.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

小結

  1. Load 載入 key 資料
  2. Store 更新或新增 key 資料
  3. Delete 刪除 key 資料
  4. Range 遍歷資料
  5. LoadOrStore 如果存在 key 資料則返回,反之則設定
  6. LoadAndDelete 如果存在 key 資料則刪除

以上,希望對你能夠有所幫助。

推薦閱讀

作者:新亮筆記(關注公眾號,可申請新增微信好友)
出處:https://www.cnblogs.com/xinliangcoder
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。