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