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 简介与用法相关推荐

  1. Golang sync.WaitGroup 简介与用法

    1.简介 sync.WaitGroup 用于阻塞等待一组 Go 程的结束.主 Go 程调用 Add() 来设置等待的 Go 程数,然后该组中的每个 Go 程都需要在运行结束时调用 Done(), 递减 ...

  2. Golang sync.Pool 简介与用法

    文章目录 1.简介 2.应用 2.1 标准库的应用 2.2 复用 bytes.Buffer 参考文章 1.简介 Pool 是可伸缩.并发安全的临时对象池,用来存放已经分配但暂时不用的临时对象,通过对象 ...

  3. Golang sync.Cond 简介与用法

    文章目录 1.简介 2.使用场景 3.原理 4.使用示例 5.注意事项 参考文章 1.简介 sync.Cond 是基于互斥锁/读写锁实现的条件变量,用来协调想要访问共享资源的那些 Goroutine. ...

  4. Golang sync.Once 简介与用法

    文章目录 1.简介 2.延迟初始化 参考文献 1.简介 sync.Once用来保证函数只执行一次.要达到这个效果,需要做到两点: (1)计数器,统计函数执行次数: (2)线程安全,保障在多 Go 程的 ...

  5. Golang sync.Map 原理(两个map实现 读写分离、适用读多写少场景)

    参考: 由浅入深聊聊Golang的sync.Map 通过对源码的逐行分析,清晰易懂 Golang sync.Map原理 通过向 sync.Map 中增删改查来介绍sync.Map的底层原理 Golan ...

  6. golang sync.Map 使用

    自1.9版本以后提供了sync.Map,支持多线程并发读写,比之前的加锁map性能要好一点. 提供一下几个方法: type Map//删除指定keyfunc (m *Map) Delete(key i ...

  7. golang sync.map

    在golang中,线程安全的map实现为sync.Map,相较于java中线程安全的map ConcurrentHashMap,在设计与实现上都有巨大的差别. java中的ConcurrentHash ...

  8. Golang sync.Map原理

    原生map的"先天不足" 对于已经初始化了的原生map,我们可以尽情地对其进行并发读: package mainimport ("fmt""math/ ...

  9. golang sync.Map和map+mutex性能比较

    目录 测试环境 测试代码 运行指令 测试结果 结论 测试环境 goos: linux goarch: amd64 go version go1.14 linux/amd64 Run on (8 X 2 ...

最新文章

  1. 浪潮刘军:为什么说计算力是AI时代“免费的午餐”?
  2. iOS10 UI教程视图的生命周期
  3. springmvc常用配置
  4. 百度拥抱年轻人,53 岁张亚勤成退休第一人!
  5. python中使用selenium模块登录QQ邮箱
  6. 云智能,助力警务大数据云平台建设
  7. SCSA网络安全------数据传输安全-------广域网加速解决方案
  8. SaaS 系统的应用与架构
  9. Ubuntu启动项管理
  10. 2021年北京积分落户名单公布了,爬了两个多小时得到了所有数据,有了惊人的发现(附源码)
  11. v-for与v-if为什么不能同时用?
  12. mysql查询学生表的总人数,MySQL(表)-实操数据查询
  13. C++小游戏笔记——射击小行星(附源码)
  14. 近三年数字图像处理与数字媒体技术相关的前沿技术研究和应用
  15. PHP社会管理网格化GIS系统,社会管理网格化平台
  16. php名片自动生成,利用PHP自动生成印有用户信息的名片
  17. 无缝滚动;flash播放器代码(网站使用);QQ帮助代码;Js添加属性IE和firefox的区别...
  18. 记录一次与华为大咖的交流
  19. PL/SQL使用SQLServer字体
  20. Cesium与Arcgis实现二三维联动

热门文章

  1. Ubuntu简单指令和热键的学习
  2. 阿里云前端周刊 - 第 15 期
  3. 纽约部署免费千兆Wi-Fi 30秒可下一部电影
  4. 第十章——维护索引(1)——索引碎片
  5. 类对象工厂设计模式(Factory Pattern)
  6. [导入]在vs2005中调用远程WebService(幻想曲)
  7. printf利用转译字符在终端显示进度条(时钟)-zhuan
  8. L2-037 包装机 (25 分)-PAT 团体程序设计天梯赛 GPLT
  9. PAT 1085. PAT单位排行 (25) - 乙级
  10. 蓝桥杯 BASIC-14 基础练习 时间转换