sync.Map(在並發環境中使用的map)


sync.Map 有以下特性:

需要並發讀寫時,一般的做法是加鎖,但這樣性能並不高,Go語言在 1.9 版本中提供了一種效率較高的並發安全的 sync.Map,sync.Map 和 map 不同,不是以語言原生形態提供,而是在 sync 包下的特殊結構。

  • 無須初始化,直接聲明即可。

  • sync.Map 不能使用 map 的方式進行取值和設置等操作,而是使用 sync.Map 的方法進行調用,Store 表示存儲,Load 表示獲取,Delete 表示刪除。

  • 使用 Range 配合一個回調函數進行遍歷操作,通過回調函數返回內部遍歷出來的值,Range 參數中回調函數的返回值在需要繼續迭代遍歷時,返回 true,終止迭代遍歷時,返回 false。

並發安全的 sync.Map 演示代碼如下:

package main
​
import (
     "fmt"
     "sync"
)
​
func main() {
​
   var scene sync.Map
​
   // 將鍵值對保存到sync.Map
   scene.Store("greece", 97)
   scene.Store("london", 100)
   scene.Store("egypt", 200)
​
   // 從sync.Map中根據鍵取值
   fmt.Println(scene.Load("london"))
​
   // 根據鍵刪除對應的鍵值對
   scene.Delete("london")
​
   // 遍歷所有sync.Map中的鍵值對
   scene.Range(func(k, v interface{}) bool {
​
       fmt.Println("iterate:", k, v)
       return true
  })
​
}

sync.Map 沒有提供獲取 map 數量的方法,替代方法是在獲取 sync.Map 時遍歷自行計算數量,sync.Map 為了保證並發安全有一些性能損失,因此在非並發情況下,使用 map 相比使用 sync.Map 會有更好的性能

代碼輸出如下:

100 true

iterate: egypt 200

iterate: greece 97

代碼說明如下:

  • 第 10 行,聲明 scene,類型為 sync.Map,注意,sync.Map 不能使用 make 創建。

  • 第 13~15 行,將一系列鍵值對保存到 sync.Map 中,sync.Map 將鍵和值以 interface{} 類型進行保存。

  • 第 18 行,提供一個 sync.Map 的鍵給 scene.Load() 方法后將查詢到鍵對應的值返回。

  • 第 21 行,sync.Map 的 Delete 可以使用指定的鍵將對應的鍵值對刪除。

  • 第 24 行,Range() 方法可以遍歷 sync.Map,遍歷需要提供一個匿名函數,參數為 k、v,類型為 interface{},每次 Range() 在遍歷一個元素時,都會調用這個匿名函數把結果返回。

sync.Map 沒有提供獲取 map 數量的方法,替代方法是在獲取 sync.Map 時遍歷自行計算數量,sync.Map 為了保證並發安全有一些性能損失,因此在非並發情況下,使用 map 相比使用 sync.Map 會有更好的性能

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM