Go使用sync.Map来解决map的并发操作问题

作者:新亮笔记 时间:2024-04-29 13:05:57 

目录
  • 前言

  • map 并发操作出现问题

  • sync.Map 解决并发操作问题

  • 计算 map 长度

  • 计算 sync.Map 长度

前言

在 Golang 中 map 不是并发安全的,自 1.9 才引入了 sync.Map ,sync.Map 的引入确实解决了 map 的并发安全问题,不过 sync.Map 却没有实现 len() 函数,如果想要计算 sync.Map 的长度,稍微有点麻烦,需要使用 Range 函数。

map 并发操作出现问题


func main() {
demo := make(map[int]int)

go func() {
 for j := 0; j < 1000; j++ {
  demo[j] = j
 }
}()

go func() {
 for j := 0; j < 1000; j++ {
  fmt.Println(demo[j])
 }
}()

time.Sleep(time.Second * 1)
}

执行输出:

fatal error: concurrent map read and map write

sync.Map 解决并发操作问题


func main() {
demo := sync.Map{}

go func() {
 for j := 0; j < 1000; j++ {
  demo.Store(j, j)
 }
}()

go func() {
 for j := 0; j < 1000; j++ {
  fmt.Println(demo.Load(j))
 }
}()

time.Sleep(time.Second * 1)
}

执行输出:
<nil> false
1 true

...

999 true

计算 map 长度


func main() {
demo := make(map[int]int)

for j := 0; j < 1000; j++ {
 demo[j] = j
}

fmt.Println("len of demo:", len(demo))
}

执行输出:
len of demo: 1000

计算 sync.Map 长度


func main() {
demo := sync.Map{}

for j := 0; j < 1000; j++ {
 demo.Store(j, j)
}

lens := 0
demo.Range(func(key, value interface{}) bool {
 lens++
 return true
})

fmt.Println("len of demo:", lens)
}

执行输出:
len of demo: 1000

小结

  • Load 加载 key 数据

  • Store 更新或新增 key 数据

  • Delete 删除 key 数据

  • Range 遍历数据

  • LoadOrStore 如果存在 key 数据则返回,反之则设置

  • LoadAndDelete 如果存在 key 数据则删除

来源:https://juejin.cn/post/7024767670276849701

标签:Go,sync.Map,map,并发操作
0
投稿

猜你喜欢

  • 基于go+vue实现的golang每日新闻数据浏览与检索平台(推荐)

    2023-06-16 12:11:26
  • 详解Python如何制作自动发送微信的程序

    2021-06-04 13:24:53
  • Python 中导入csv数据的三种方法

    2022-02-24 10:12:10
  • JavaScript实现三种常用网页特效(offset、client、scroll系列)

    2023-08-27 11:54:30
  • PyQt5+pycharm开发环境搭建的实现步骤(图文)

    2021-05-19 17:27:40
  • PyTorch详解经典网络ResNet实现流程

    2022-08-06 09:40:32
  • 蚁群算法js版

    2008-10-08 10:15:00
  • Python批量处理csv并保存过程解析

    2022-07-04 16:17:02
  • Django中create和save方法的不同

    2021-06-16 14:24:02
  • Mysql使用kill命令解决死锁问题(杀死某条正在执行的sql语句)

    2024-01-24 06:36:03
  • Python 图像处理 Pillow 库详情

    2022-12-05 04:46:12
  • python爬取m3u8连接的视频

    2023-06-18 13:40:21
  • Python基础之循环语句用法示例【for、while循环】

    2022-06-03 19:37:50
  • mysql数据库mysql: [ERROR] unknown option '--skip-grant-tables'

    2024-01-18 08:41:27
  • golang 实现并发求和

    2024-02-02 07:15:58
  • python 实现检验33品种数据是否是正态分布

    2022-09-25 19:57:55
  • python 字典修改键(key)的几种方法

    2021-01-05 16:58:00
  • Python入门之布尔值详解

    2023-01-17 06:29:58
  • MSSQL 2005 LOG备份webshell的方法

    2024-01-16 16:43:24
  • Python3使用pandas模块读写excel操作示例

    2021-06-30 16:34:47
  • asp之家 网络编程 m.aspxhome.com