go在并发情况下使用map
2023-09-14 08:56:57 时间
两种方式解决并发访问map
- 读写锁实现并发安全Map
- sync.Map
读写锁实现并发安全Map
并发访问map是不安全的。
所以如果希望在多协程中并发访问map,必须提供某种同步机制,一般情况下通过读写锁sync.RWMutex实现对map的并发访问控制,将map和sync.RWMutex封装一下,可以实现对map的安全并发访问。
package main import ( "fmt" "sync" ) // M type M struct { Map map[interface{}]interface{} lock *sync.RWMutex } // Set ... func (m *M) Set(key interface{}, value interface{}) { m.lock.RLock() defer m.lock.RUnlock() m.Map[key] = value } // Get ... func (m *M) Get(key interface{}) interface{} { m.lock.Lock() defer m.lock.Unlock() return m.Map[key] } func main() { Map := &M{ make(map[interface{}]interface{}), new(sync.RWMutex), } Map.Set(2,"2323") Map.Set("hello",343) fmt.Println(Map.Get(2)) fmt.Println(Map.Get("hello")) }
sync.Map
go1.9之后加入了支持并发安全的Map sync.Map。
sync.Map 通过一份只使用原子操作的数据和一份冗余了只读数据的加锁数据实现一定程度上的读写分离,使得大多数读操作和更新操作是原子操作,写入新数据才加锁的方式来提升性能。
1、Store 存 key,value
2、LoadOrStore 取&存
3、Load 取key对应的value
4、Range 遍历所有的key,value
5、Delete 删除key,及其value
package main import ( "fmt" "sync" ) func main() { var m sync.Map //Store m.Store(1,"a") m.Store(2,"b") //LoadOrStore //若key不存在,则存入key和value,返回false和输入的value v,ok := m.LoadOrStore("1","aaa") fmt.Println(ok,v) //false aaa //若key已存在,则返回true和key对应的value,不会修改原来的value v,ok = m.LoadOrStore(1,"aaa") fmt.Println(ok,v) //false aaa //Load v,ok = m.Load(1) if ok{ fmt.Println("it's an existing key,value is ",v) } else { fmt.Println("it's an unknown key") } //Range //遍历sync.Map, 要求输入一个func作为参数 f := func(k, v interface{}) bool { //这个函数的入参、出参的类型都已经固定,不能修改 //可以在函数体内编写自己的代码,调用map中的k,v fmt.Println(k,v) return true } m.Range(f) //Delete m.Delete(1) fmt.Println(m.Load(1)) }
refer:
相关文章
- Go语言数据类型之特殊常量iota的使用(九)
- Go-Excelize API源码阅读(十三)—— GetSheetVisible、SetSheetFormatPr
- 2022全球程序员薪资排行:中国倒数,美国写Go最挣钱
- 【Go】sync.WaitGroup 源码阅读
- 效率提高80%,Go开发必备的库与工具!
- go struct转map_golang map
- Go 语言正则匹配 ID 逗号分隔 数字、英文字母、中文
- 2022-09-28:以下go语言代码输出什么?A:1 1;B:1 2;C:2 2;D:不确定。package mainimpo
- C++map的遍历_Map集合循环遍历的几种方式
- go中的map和锁
- 基于Go/Grpc/kubernetes/Istio开发微服务的最佳实践尝试 - 2/3
- Go-标准库-time(一)
- Go语言垃圾回收和SetFinalizer
- Go语言go mod包依赖管理工具使用详解
- go基础之–函数和map详解编程语言
- 使用Go语言来操作Oracle数据库(go语言oracle)
- Go—go-cache包学习详解编程语言
- go语言之map详解编程语言
- Go 语言在极小硬件上的运用(一)
- Go 中对栈中函数进行内联
- Redis有序Map:高效有序排列的利器(redis有序map)
- 语言结合SQL Server,Go谱写新篇章(sqlserver的go)
- 请求简单而快速用Go编写的Redis请求测试(用go写的redis)
- Go语言查询Oracle数据库实战实例(go语言查询oracle)
- GO语言映射(Map)用法分析