背景
go中map數(shù)據(jù)結(jié)構(gòu)不是線程安全的,即多個goroutine同時操作一個map,則會報錯,因此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{})
//這個相當于是寫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中的值。
//因為for ... range map是內(nèi)置的語言特性,所以沒有辦法使用for range遍歷sync.Map, 但是可以使用它的Range方法,通過回調(diào)的方式遍
實踐
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
}
}
總結(jié)
- 讀寫鎖和互斥鎖 讀寫鎖: 可以獲取多個讀鎖,只有讀寫沖突(加了讀鎖的時候,其它線程不能寫) 互斥鎖:跟讀寫操作無關(guān),加了鎖,鎖內(nèi)的資源就線程獨享
- 個人感覺使用起來不太方便,不如根據(jù)實際場景自己互斥鎖。比如map都是可讀的,只有寫的時候需要串行執(zhí)行,則寫操作封裝互斥鎖即可
- sync.Map因為內(nèi)部的操作較多等原因,并不適合大量寫的場景(適合大量讀,少量寫)。
- sync.Map的原理詳見:https://www.jb51.net/article/188788.htm
參考
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)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- 深度解密 Go 語言中的 sync.map
- golang中sync.Map并發(fā)創(chuàng)建、讀取問題實戰(zhàn)記錄
- Go 并發(fā)讀寫 sync.map 詳細