亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

golang中使用sync.Map的方法

 更新時(shí)間:2020年06月16日 22:39:11   作者:IT技術(shù)小小鳥  
這篇文章主要介紹了golang中使用sync.Map的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

背景

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

sync.Map思路來(lái)自java的ConcurrentHashMap

接口

sync.map就是1.9版本帶的線程安全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)于是寫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ǔ)言特性,所以沒有辦法使用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)有線程進(jìn)去進(jìn)行加鎖
	num++
	at.m.Unlock() //出來(lái)后解鎖,其他線程才可以進(jìn)去
	wg.Done()
}

func (at *AddTest) decrement(wg *sync.WaitGroup) {
	//互斥鎖
	at.m.Lock() //當(dāng)有線程進(jìn)去進(jìn)行加鎖
	num--
	at.m.Unlock() //出來(lái)后解鎖,其他線程才可以進(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í)候,其它線程不能寫) 互斥鎖:跟讀寫操作無(wú)關(guān),加了鎖,鎖內(nèi)的資源就線程獨(dú)享
  • 個(gè)人感覺使用起來(lái)不太方便,不如根據(jù)實(shí)際場(chǎng)景自己互斥鎖。比如map都是可讀的,只有寫的時(shí)候需要串行執(zhí)行,則寫操作封裝互斥鎖即可
  • sync.Map因?yàn)閮?nèi)部的操作較多等原因,并不適合大量寫的場(chǎng)景(適合大量讀,少量寫)。
  • sync.Map的原理詳見: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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • GO將mysql?中?decimal?數(shù)據(jù)類型映射到?protobuf的操作方法

    GO將mysql?中?decimal?數(shù)據(jù)類型映射到?protobuf的操作方法

    這篇文章主要介紹了go如何優(yōu)雅地將?mysql?中?decimal?數(shù)據(jù)類型映射到?protobuf,本文主要展示一下在 protobuf中 float與double的一個(gè)區(qū)別,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Go語(yǔ)言實(shí)現(xiàn)類似c++中的多態(tài)功能實(shí)例

    Go語(yǔ)言實(shí)現(xiàn)類似c++中的多態(tài)功能實(shí)例

    Go本身不具有多態(tài)的特性,不能夠像Java、C++那樣編寫多態(tài)類、多態(tài)方法。但是,使用Go可以編寫具有多態(tài)功能的類綁定的方法。下面來(lái)一起看看吧
    2016-09-09
  • 代碼之美:探索Go語(yǔ)言斷行規(guī)則的奧秘

    代碼之美:探索Go語(yǔ)言斷行規(guī)則的奧秘

    Go語(yǔ)言是一門以簡(jiǎn)潔、清晰和高效著稱的編程語(yǔ)言,而斷行規(guī)則是其代碼風(fēng)格的重要組成部分,通過(guò)深入研究Go語(yǔ)言的斷行規(guī)則,我們可以更好地理解和編寫優(yōu)雅的代碼,本文將從語(yǔ)法規(guī)范、代碼風(fēng)格和最佳實(shí)踐等方面進(jìn)行探討,幫助讀者更好地理解和應(yīng)用Go語(yǔ)言的斷行規(guī)則
    2023-10-10
  • Go通過(guò)不變性優(yōu)化程序詳解

    Go通過(guò)不變性優(yōu)化程序詳解

    這篇文章主要為大家介紹了Go通過(guò)不變性優(yōu)化程序?qū)嵗斀?,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Golang實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能

    Golang實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能

    這篇文章主要為大家詳細(xì)介紹了Golang實(shí)現(xiàn)斷點(diǎn)續(xù)傳、復(fù)制文件功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • golang內(nèi)置函數(shù)len的小技巧

    golang內(nèi)置函數(shù)len的小技巧

    len是很常用的內(nèi)置函數(shù),可以測(cè)量字符串、slice、array、channel以及map的長(zhǎng)度/元素個(gè)數(shù)。本文就來(lái)介紹一下其他小技巧,感興趣的可以了解一下
    2021-07-07
  • Go語(yǔ)言kafka生產(chǎn)消費(fèi)消息實(shí)例搬磚

    Go語(yǔ)言kafka生產(chǎn)消費(fèi)消息實(shí)例搬磚

    這篇文章主要為大家介紹了Go語(yǔ)言kafka生產(chǎn)消費(fèi)消息的實(shí)例搬磚,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go標(biāo)準(zhǔn)庫(kù)-ServeMux的使用與模式匹配深入探究

    Go標(biāo)準(zhǔn)庫(kù)-ServeMux的使用與模式匹配深入探究

    這篇文章主要為大家介紹了Go標(biāo)準(zhǔn)庫(kù)-ServeMux的使用與模式匹配深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • GO語(yǔ)言延遲函數(shù)defer用法分析

    GO語(yǔ)言延遲函數(shù)defer用法分析

    這篇文章主要介紹了GO語(yǔ)言延遲函數(shù)defer用法,較為詳細(xì)的分析了GO語(yǔ)言的特性與具體用法,并給出了一個(gè)比較典型的應(yīng)用實(shí)例,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-12-12
  • Golang中常用的語(yǔ)法糖分享

    Golang中常用的語(yǔ)法糖分享

    語(yǔ)法糖,也稱糖語(yǔ)法,是由英國(guó)計(jì)算機(jī)科學(xué)家彼得·蘭丁提出的,用于表示編程語(yǔ)言中的某種類型的語(yǔ)法,這些語(yǔ)法不會(huì)影響功能,但使用起來(lái)卻很方便,本文就來(lái)看看Golang中常用的語(yǔ)法糖有哪些吧
    2023-05-05

最新評(píng)論