背景
go中map數(shù)據(jù)結構不是線程安全的,即多個goroutine同時操作一個map,則會報錯,因此go1.9之后誕生了sync.Map
sync.Map思路來自java的ConcurrentHashMap
接口
sync.map就是1.9版本帶的線程安全map,主要有如下幾種方法:
Load(key interface{}) (value interface{}, ok bool) //通過提供一個鍵key,查找對應的值value,如果不存在,則返回nil。ok的結果表示是否在map中找到值 Store(key, value interface{}) //這個相當于是寫map(更新或新增),第一個參數(shù)是key,第二個參數(shù)是value LoadOrStore(key, value interface{}) (actual interface{}, loaded bool) //通過提供一個鍵key,查找對應的值value,如果存在返回鍵的現(xiàn)有值,否則存儲并返回給定的值,如果是讀取則返回true,如果是存儲返回false Delete(key interface{}) //通過提供一個鍵key,刪除鍵對應的值 Range(f func(key, value interface{}) bool) //循環(huán)讀取map中的值。 //因為for ... range map是內置的語言特性,所以沒有辦法使用for range遍歷sync.Map, 但是可以使用它的Range方法,通過回調的方式遍
實踐
package main import ( "fmt" "sync" ) var num = 0 var addTest *AddTest func init() { addTest = AddTest{} } type AddTest struct { m sync.Mutex } func (at *AddTest) increment(wg *sync.WaitGroup) { //互斥鎖 at.m.Lock() //當有線程進去進行加鎖 num++ at.m.Unlock() //出來后解鎖,其他線程才可以進去 wg.Done() } func (at *AddTest) decrement(wg *sync.WaitGroup) { //互斥鎖 at.m.Lock() //當有線程進去進行加鎖 num-- at.m.Unlock() //出來后解鎖,其他線程才可以進去 wg.Done() } var w sync.WaitGroup var aa map[int]int func main() { var bb sync.Map var wg sync.WaitGroup //aa = make(map[int]int) wg.Add(2) go func() { //wg.Add(1) for i:=0 ;i 100; i++{ //aa[i] = i+1 //fmt.Println("a") bb.Store(i, i+1) } wg.Done() }() go func() { for i:=0 ;i 100; i++{ //aa[i] = i+1 //fmt.Println("a") bb.Store(i, i+1) } wg.Done() }() wg.Wait() bb.Range(func(k, v interface{}) bool { fmt.Println("iterate:", k, v) return true } }
總結
參考
https://www.kancloud.cn/liupengjie/go/718991
https://colobu.com/2017/07/11/dive-into-sync-Map/
到此這篇關于golang中使用sync.Map的文章就介紹到這了,更多相關golang中使用sync.Map內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
標簽:廣西 貴陽 德州 調研邀請 阿克蘇 太原 慶陽 西雙版納
巨人網絡通訊聲明:本文標題《golang中使用sync.Map的方法》,本文關鍵詞 golang,中,使用,sync.Map,的,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。