主頁(yè) > 知識(shí)庫(kù) > golang中使用sync.Map的方法

golang中使用sync.Map的方法

熱門標(biāo)簽:地圖標(biāo)注測(cè)試 廣東語(yǔ)音外呼系統(tǒng)供應(yīng)商 濮陽(yáng)自動(dòng)外呼系統(tǒng)代理 福州鐵通自動(dòng)外呼系統(tǒng) 烏魯木齊人工電銷機(jī)器人系統(tǒng) 澳門防封電銷卡 智能電銷機(jī)器人營(yíng)銷 長(zhǎng)沙ai機(jī)器人電銷 賺地圖標(biāo)注的錢犯法嗎

背景

go中map數(shù)據(jù)結(jié)構(gòu)不是線程安全的,即多個(gè)goroutine同時(shí)操作一個(gè)map,則會(huì)報(bào)錯(cuò),因此go1.9之后誕生了sync.Map

sync.Map思路來自java的ConcurrentHashMap

接口

sync.map就是1.9版本帶的線程安全map,主要有如下幾種方法:

Load(key interface{}) (value interface{}, ok bool)
//通過提供一個(gè)鍵key,查找對(duì)應(yīng)的值value,如果不存在,則返回nil。ok的結(jié)果表示是否在map中找到值

Store(key, value interface{})
//這個(gè)相當(dāng)于是寫map(更新或新增),第一個(gè)參數(shù)是key,第二個(gè)參數(shù)是value

LoadOrStore(key, value interface{}) (actual interface{}, loaded bool)
//通過提供一個(gè)鍵key,查找對(duì)應(yīng)的值value,如果存在返回鍵的現(xiàn)有值,否則存儲(chǔ)并返回給定的值,如果是讀取則返回true,如果是存儲(chǔ)返回false

Delete(key interface{})
//通過提供一個(gè)鍵key,刪除鍵對(duì)應(yīng)的值

Range(f func(key, value interface{}) bool)
//循環(huán)讀取map中的值。
//因?yàn)閒or ... range map是內(nèi)置的語(yǔ)言特性,所以沒有辦法使用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é)

  • 讀寫鎖和互斥鎖 讀寫鎖: 可以獲取多個(gè)讀鎖,只有讀寫沖突(加了讀鎖的時(shí)候,其它線程不能寫) 互斥鎖:跟讀寫操作無關(guān),加了鎖,鎖內(nèi)的資源就線程獨(dú)享
  • 個(gè)人感覺使用起來不太方便,不如根據(jù)實(shí)際場(chǎng)景自己互斥鎖。比如map都是可讀的,只有寫的時(shí)候需要串行執(zhí)行,則寫操作封裝互斥鎖即可
  • sync.Map因?yàn)閮?nèi)部的操作較多等原因,并不適合大量寫的場(chǎng)景(適合大量讀,少量寫)。
  • 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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 深度解密 Go 語(yǔ)言中的 sync.map
  • golang中sync.Map并發(fā)創(chuàng)建、讀取問題實(shí)戰(zhàn)記錄
  • Go 并發(fā)讀寫 sync.map 詳細(xì)

標(biāo)簽:廣西 貴陽(yáng) 德州 調(diào)研邀請(qǐng) 阿克蘇 太原 慶陽(yáng) 西雙版納

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang中使用sync.Map的方法》,本文關(guān)鍵詞  golang,中,使用,sync.Map,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang中使用sync.Map的方法》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于golang中使用sync.Map的方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章