最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang中使用sync.Map的方法

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

背景

go中map數據結構不是線程安全的,即多個goroutine同時操作一個map,則會報錯,因此go1.9之后誕生了sync.Map

sync.Map思路來自java的ConcurrentHashMap

接口

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

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

Store(key, value interface{})
//這個相當于是寫map(更新或新增),第一個參數是key,第二個參數是value

LoadOrStore(key, value interface{}) (actual interface{}, loaded bool)
//通過提供一個鍵key,查找對應的值value,如果存在返回鍵的現有值,否則存儲并返回給定的值,如果是讀取則返回true,如果是存儲返回false

Delete(key interface{})
//通過提供一個鍵key,刪除鍵對應的值

Range(f func(key, value interface{}) bool)
//循環(huán)讀取map中的值。
//因為for ... range map是內置的語言特性,所以沒有辦法使用for range遍歷sync.Map, 但是可以使用它的Range方法,通過回調的方式遍

實踐

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
	}
}

總結

  • 讀寫鎖和互斥鎖 讀寫鎖: 可以獲取多個讀鎖,只有讀寫沖突(加了讀鎖的時候,其它線程不能寫) 互斥鎖:跟讀寫操作無關,加了鎖,鎖內的資源就線程獨享
  • 個人感覺使用起來不太方便,不如根據實際場景自己互斥鎖。比如map都是可讀的,只有寫的時候需要串行執(zhí)行,則寫操作封裝互斥鎖即可
  • sync.Map因為內部的操作較多等原因,并不適合大量寫的場景(適合大量讀,少量寫)。
  • sync.Map的原理詳見:http://m.fzitv.net/article/188788.htm

參考

https://www.kancloud.cn/liupengjie/go/718991

https://colobu.com/2017/07/11/dive-into-sync-Map/

到此這篇關于golang中使用sync.Map的文章就介紹到這了,更多相關golang中使用sync.Map內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go使用Weighted實現資源管理

    Go使用Weighted實現資源管理

    這篇文章主要介紹了Go?語言中的?Weighted?并發(fā)原語,包括?Weighted?的基本使用方法、實現原理、使用注意事項等內容,感興趣的小伙伴可以了解一下
    2023-06-06
  • 一文帶你了解Go語言中函數設計的實踐示例

    一文帶你了解Go語言中函數設計的實踐示例

    良好設計的函數具有清晰的職責和邏輯結構,提供準確的命名和適當的參數控制,下面我們將一一描述函數設計時能夠遵循的最佳實踐,希望對大家有所幫助
    2023-06-06
  • golang接口的正確用法分享

    golang接口的正確用法分享

    這篇文章主要介紹了golang接口的正確用法分享的相關資料,需要的朋友可以參考下
    2023-09-09
  • go語言通過odbc操作Access數據庫的方法

    go語言通過odbc操作Access數據庫的方法

    這篇文章主要介紹了go語言通過odbc操作Access數據庫的方法,實例分析了Go語言通過odbc連接、查詢與關閉access數據庫的技巧,需要的朋友可以參考下
    2015-03-03
  • 如何使用Goland IDE go mod 方式構建項目

    如何使用Goland IDE go mod 方式構建項目

    這篇文章主要介紹了如何使用Goland IDE go mod 方式構建項目,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Go單例模式與Once源碼實現

    Go單例模式與Once源碼實現

    這篇文章主要介紹了Go單例模式與Once源碼實現,本文結合示例代碼給大家講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • Go語言基礎單元測試與性能測試示例詳解

    Go語言基礎單元測試與性能測試示例詳解

    這篇文章主要為大家介紹了Go語言基礎單元測試與性能測試示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進步
    2021-11-11
  • go中的參數傳遞是值傳遞還是引用傳遞的實現

    go中的參數傳遞是值傳遞還是引用傳遞的實現

    參數傳遞機制是一個重要的概念,它決定了函數內部對參數的修改是否會影響到原始數據,本文主要介紹了go中的參數傳遞是值傳遞還是引用傳遞的實現,感興趣的可以了解一下
    2024-12-12
  • Go語言中Redis緩存與本地內存緩存實戰(zhàn)

    Go語言中Redis緩存與本地內存緩存實戰(zhàn)

    在現代高并發(fā)系統中,緩存技術是提升性能和降低數據庫壓力的關鍵手段,本文將為大家介紹一下Redis緩存與本地內存緩存的具體應用,需要的可以了解下
    2025-03-03
  • golang正則之命名分組方式

    golang正則之命名分組方式

    這篇文章主要介紹了golang正則之命名分組方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04

最新評論

砚山县| 竹北市| 麦盖提县| 兖州市| 绿春县| 隆昌县| 文成县| 六枝特区| 呼玛县| 宁乡县| 弥渡县| 卢龙县| 越西县| 青河县| 科技| 车致| 前郭尔| 泊头市| 桓仁| 深泽县| 固阳县| 宁海县| 望奎县| 贡觉县| 凤冈县| 宜州市| 奉新县| 阿拉善左旗| 河池市| 永新县| 石城县| 陵川县| 旬邑县| 嘉义市| 马鞍山市| 阿鲁科尔沁旗| 韶山市| 梧州市| 永城市| 九江市| 澎湖县|