• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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)
    //循环读取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
    	}
    }

    总结

    参考

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

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

    到此这篇关于golang中使用sync.Map的文章就介绍到这了,更多相关golang中使用sync.Map内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • 深度解密 Go 语言中的 sync.map
    • golang中sync.Map并发创建、读取问题实战记录
    • Go 并发读写 sync.map 详细
    上一篇:深度解密 Go 语言中的 sync.map
    下一篇:详解Golang开启http服务的三种方式
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    golang中使用sync.Map的方法 golang,中,使用,sync.Map,的,