Golang sync.Map 简介与用法
Golang 中的 map 在并发情况下,只读是线程安全的,并发读写线程不安全。为了解决这个问题,Golang 提供了语言层级的并发读写安全的 sync.Map。
type Map struct {// contains filtered or unexported fields
}//删除操作
func (m *Map) Delete(key interface{})//读操作
func (m *Map) Load(key interface{}) (value interface{}, ok bool)//读取或写入。存在指定的 key 则读取,否则写入。actual为存在的 value 或新写入的 value,loaded 读操作返回true,写操作返回false
func (m *Map) LoadOrStore(key, value interface{}) (actual interface{}, loaded bool)//写操作
func (m *Map) Store(key, value interface{})//遍历
func (m *Map) Range(f func(key, value interface{}) bool)
sync.Map 开箱即用,无需像 map 调用 make() 进行显示初始化。此外,sync.Map 的 key 和 value 类型为空接口 interface{},表示可存储任意类型的数据。示例代码如下:
package mainimport ("fmt""sync"
)var m sync.Mapfunc main() {// 写m.Store("dablelv", "27")m.Store("cat", "28")// 读v, ok := m.Load("dablelv")fmt.Printf("Load: v, ok = %v, %v\n", v, ok) // 删除 m.Delete("dablelv")// 读或写// 如果 key 存在则读并返回 true,否则写并返回 falsev, ok = m.LoadOrStore("dablelv", "18")fmt.Printf("LoadOrStore: v, ok = %v, %v\n", v, ok)// 遍历// 操作函数f := func(key, value interface{}) bool {fmt.Printf("Range: k, v = %v, %v\n", key, value)return true} m.Range(f)
}
编译运行输出:
Load: v, ok = 27, true
LoadOrStore: v, ok = 18, false
Range: k, v = dablelv, 18
Range: k, v = cat, 28
参考文献
[1] Golang 官网.sync
[2] Go 1.9 sync.Map揭秘
Golang sync.Map 简介与用法相关推荐
- Golang sync.WaitGroup 简介与用法
1.简介 sync.WaitGroup 用于阻塞等待一组 Go 程的结束.主 Go 程调用 Add() 来设置等待的 Go 程数,然后该组中的每个 Go 程都需要在运行结束时调用 Done(), 递减 ...
- Golang sync.Pool 简介与用法
文章目录 1.简介 2.应用 2.1 标准库的应用 2.2 复用 bytes.Buffer 参考文章 1.简介 Pool 是可伸缩.并发安全的临时对象池,用来存放已经分配但暂时不用的临时对象,通过对象 ...
- Golang sync.Cond 简介与用法
文章目录 1.简介 2.使用场景 3.原理 4.使用示例 5.注意事项 参考文章 1.简介 sync.Cond 是基于互斥锁/读写锁实现的条件变量,用来协调想要访问共享资源的那些 Goroutine. ...
- Golang sync.Once 简介与用法
文章目录 1.简介 2.延迟初始化 参考文献 1.简介 sync.Once用来保证函数只执行一次.要达到这个效果,需要做到两点: (1)计数器,统计函数执行次数: (2)线程安全,保障在多 Go 程的 ...
- Golang sync.Map 原理(两个map实现 读写分离、适用读多写少场景)
参考: 由浅入深聊聊Golang的sync.Map 通过对源码的逐行分析,清晰易懂 Golang sync.Map原理 通过向 sync.Map 中增删改查来介绍sync.Map的底层原理 Golan ...
- golang sync.Map 使用
自1.9版本以后提供了sync.Map,支持多线程并发读写,比之前的加锁map性能要好一点. 提供一下几个方法: type Map//删除指定keyfunc (m *Map) Delete(key i ...
- golang sync.map
在golang中,线程安全的map实现为sync.Map,相较于java中线程安全的map ConcurrentHashMap,在设计与实现上都有巨大的差别. java中的ConcurrentHash ...
- Golang sync.Map原理
原生map的"先天不足" 对于已经初始化了的原生map,我们可以尽情地对其进行并发读: package mainimport ("fmt""math/ ...
- golang sync.Map和map+mutex性能比较
目录 测试环境 测试代码 运行指令 测试结果 结论 测试环境 goos: linux goarch: amd64 go version go1.14 linux/amd64 Run on (8 X 2 ...
最新文章
- 浪潮刘军:为什么说计算力是AI时代“免费的午餐”?
- iOS10 UI教程视图的生命周期
- springmvc常用配置
- 百度拥抱年轻人,53 岁张亚勤成退休第一人!
- python中使用selenium模块登录QQ邮箱
- 云智能,助力警务大数据云平台建设
- SCSA网络安全------数据传输安全-------广域网加速解决方案
- SaaS 系统的应用与架构
- Ubuntu启动项管理
- 2021年北京积分落户名单公布了,爬了两个多小时得到了所有数据,有了惊人的发现(附源码)
- v-for与v-if为什么不能同时用?
- mysql查询学生表的总人数,MySQL(表)-实操数据查询
- C++小游戏笔记——射击小行星(附源码)
- 近三年数字图像处理与数字媒体技术相关的前沿技术研究和应用
- PHP社会管理网格化GIS系统,社会管理网格化平台
- php名片自动生成,利用PHP自动生成印有用户信息的名片
- 无缝滚动;flash播放器代码(网站使用);QQ帮助代码;Js添加属性IE和firefox的区别...
- 记录一次与华为大咖的交流
- PL/SQL使用SQLServer字体
- Cesium与Arcgis实现二三维联动
热门文章
- Ubuntu简单指令和热键的学习
- 阿里云前端周刊 - 第 15 期
- 纽约部署免费千兆Wi-Fi 30秒可下一部电影
- 第十章——维护索引(1)——索引碎片
- 类对象工厂设计模式(Factory Pattern)
- [导入]在vs2005中调用远程WebService(幻想曲)
- printf利用转译字符在终端显示进度条(时钟)-zhuan
- L2-037 包装机 (25 分)-PAT 团体程序设计天梯赛 GPLT
- PAT 1085. PAT单位排行 (25) - 乙级
- 蓝桥杯 BASIC-14 基础练习 时间转换