golang中使用sync.Map的方法
背景
go中map數(shù)據(jù)結(jié)構(gòu)不是線(xiàn)程安全的,即多個(gè)goroutine同時(shí)操作一個(gè)map,則會(huì)報(bào)錯(cuò),因此go1.9之后誕生了sync.Map
sync.Map思路來(lái)自java的ConcurrentHashMap
接口
sync.map就是1.9版本帶的線(xiàn)程安全map,主要有如下幾種方法:
Load(key interface{}) (value interface{}, ok bool)
//通過(guò)提供一個(gè)鍵key,查找對(duì)應(yīng)的值value,如果不存在,則返回nil。ok的結(jié)果表示是否在map中找到值
Store(key, value interface{})
//這個(gè)相當(dāng)于是寫(xiě)map(更新或新增),第一個(gè)參數(shù)是key,第二個(gè)參數(shù)是value
LoadOrStore(key, value interface{}) (actual interface{}, loaded bool)
//通過(guò)提供一個(gè)鍵key,查找對(duì)應(yīng)的值value,如果存在返回鍵的現(xiàn)有值,否則存儲(chǔ)并返回給定的值,如果是讀取則返回true,如果是存儲(chǔ)返回false
Delete(key interface{})
//通過(guò)提供一個(gè)鍵key,刪除鍵對(duì)應(yīng)的值
Range(f func(key, value interface{}) bool)
//循環(huán)讀取map中的值。
//因?yàn)閒or ... range map是內(nèi)置的語(yǔ)言特性,所以沒(méi)有辦法使用for range遍歷sync.Map, 但是可以使用它的Range方法,通過(guò)回調(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)有線(xiàn)程進(jìn)去進(jìn)行加鎖
num++
at.m.Unlock() //出來(lái)后解鎖,其他線(xiàn)程才可以進(jìn)去
wg.Done()
}
func (at *AddTest) decrement(wg *sync.WaitGroup) {
//互斥鎖
at.m.Lock() //當(dāng)有線(xiàn)程進(jìn)去進(jìn)行加鎖
num--
at.m.Unlock() //出來(lái)后解鎖,其他線(xiàn)程才可以進(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é)
- 讀寫(xiě)鎖和互斥鎖 讀寫(xiě)鎖: 可以獲取多個(gè)讀鎖,只有讀寫(xiě)沖突(加了讀鎖的時(shí)候,其它線(xiàn)程不能寫(xiě)) 互斥鎖:跟讀寫(xiě)操作無(wú)關(guān),加了鎖,鎖內(nèi)的資源就線(xiàn)程獨(dú)享
- 個(gè)人感覺(jué)使用起來(lái)不太方便,不如根據(jù)實(shí)際場(chǎng)景自己互斥鎖。比如map都是可讀的,只有寫(xiě)的時(shí)候需要串行執(zhí)行,則寫(xiě)操作封裝互斥鎖即可
- sync.Map因?yàn)閮?nèi)部的操作較多等原因,并不適合大量寫(xiě)的場(chǎng)景(適合大量讀,少量寫(xiě))。
- sync.Map的原理詳見(jiàn):http://chabaoo.cn/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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 深度解密 Go 語(yǔ)言中的 sync.map
- Go 并發(fā)讀寫(xiě) sync.map 詳細(xì)
- Go語(yǔ)言sync.Map詳解及使用場(chǎng)景
- Golang中的同步工具sync.Map示例詳解
- Golang sync.Map原理深入分析講解
- Golang?sync.Map底層實(shí)現(xiàn)場(chǎng)景示例詳解
- Golang map與sync.map的異同詳解
- 一文帶你深入探究Go語(yǔ)言中的sync.Map
- golang讀寫(xiě)分離sync.Map的使用
- go sync.Map基本原理深入解析
- go中普通map和sync.map的區(qū)別小結(jié)
相關(guān)文章
一文帶你了解Go語(yǔ)言中函數(shù)設(shè)計(jì)的實(shí)踐示例
良好設(shè)計(jì)的函數(shù)具有清晰的職責(zé)和邏輯結(jié)構(gòu),提供準(zhǔn)確的命名和適當(dāng)?shù)膮?shù)控制,下面我們將一一描述函數(shù)設(shè)計(jì)時(shí)能夠遵循的最佳實(shí)踐,希望對(duì)大家有所幫助2023-06-06
go語(yǔ)言通過(guò)odbc操作Access數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了go語(yǔ)言通過(guò)odbc操作Access數(shù)據(jù)庫(kù)的方法,實(shí)例分析了Go語(yǔ)言通過(guò)odbc連接、查詢(xún)與關(guān)閉access數(shù)據(jù)庫(kù)的技巧,需要的朋友可以參考下2015-03-03
如何使用Goland IDE go mod 方式構(gòu)建項(xiàng)目
這篇文章主要介紹了如何使用Goland IDE go mod 方式構(gòu)建項(xiàng)目,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
Go語(yǔ)言基礎(chǔ)單元測(cè)試與性能測(cè)試示例詳解
這篇文章主要為大家介紹了Go語(yǔ)言基礎(chǔ)單元測(cè)試與性能測(cè)試示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步2021-11-11
go中的參數(shù)傳遞是值傳遞還是引用傳遞的實(shí)現(xiàn)
參數(shù)傳遞機(jī)制是一個(gè)重要的概念,它決定了函數(shù)內(nèi)部對(duì)參數(shù)的修改是否會(huì)影響到原始數(shù)據(jù),本文主要介紹了go中的參數(shù)傳遞是值傳遞還是引用傳遞的實(shí)現(xiàn),感興趣的可以了解一下2024-12-12
Go語(yǔ)言中Redis緩存與本地內(nèi)存緩存實(shí)戰(zhàn)
在現(xiàn)代高并發(fā)系統(tǒng)中,緩存技術(shù)是提升性能和降低數(shù)據(jù)庫(kù)壓力的關(guān)鍵手段,本文將為大家介紹一下Redis緩存與本地內(nèi)存緩存的具體應(yīng)用,需要的可以了解下2025-03-03

