首页>>后端>>Golang->Go 使用sync.Map来解决map的并发操作问题

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

时间:2023-11-30 本站 点击:0

前言

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

map 并发操作出现问题

funcmain(){demo:=make(map[int]int)gofunc(){forj:=0;j<1000;j++{demo[j]=j}}()gofunc(){forj:=0;j<1000;j++{fmt.Println(demo[j])}}()time.Sleep(time.Second*1)}

执行输出:

fatalerror:concurrentmapreadandmapwrite

sync.Map 解决并发操作问题

funcmain(){demo:=sync.Map{}gofunc(){forj:=0;j<1000;j++{demo.Store(j,j)}}()gofunc(){forj:=0;j<1000;j++{fmt.Println(demo.Load(j))}}()time.Sleep(time.Second*1)}

执行输出:

<nil>false1true...999true

计算 map 长度

funcmain(){demo:=make(map[int]int)forj:=0;j<1000;j++{demo[j]=j}fmt.Println("lenofdemo:",len(demo))}

执行输出:

lenofdemo:1000

计算 sync.Map 长度

funcmain(){demo:=sync.Map{}forj:=0;j<1000;j++{demo.Store(j,j)}lens:=0demo.Range(func(key,valueinterface{})bool{lens++returntrue})fmt.Println("lenofdemo:",lens)}

执行输出:

lenofdemo:1000

小结

Load 加载 key 数据

Store 更新或新增 key 数据

Delete 删除 key 数据

Range 遍历数据

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

LoadAndDelete 如果存在 key 数据则删除

以上,希望对你能够有所帮助。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Golang/4599.html