Go语言并发安全的map(sync.Map)

sync.Map

在Go 1.6之前,内置的map类型是部分goroutine安全的,并发的读没有问题,并发的写可能有问题。自go 1.6之后,并发地读写map会报错,这在一些知名的开源库中都存在这个问题,所以go 1.9之前的解决方案是额外绑定一个锁,封装成一个新的struct或者单独使用锁都可以。

在Go1.9之前,go自带的map不是并发安全的,也就是说,我们需要自己再封装一层,给map加上把读写锁,比如像下面这样:

用MapWithLock的读写锁去控制map的并发安全。

但是到了Go1.9发布,它有了一个新的特性,那就是sync.map,它是原生支持并发安全的map,不过它的用法和以前我们熟悉的map完全不一样,主要还是因为sync.map封装了更为复杂的数据结构,以实现比之前加锁map更优秀的性能。

sync.map就是1.9版本带的线程安全map,主要有如下几种方法:

通过提供一个键key,查找对应的值value,如果不存在,则返回nil。ok的结果表示是否在map中找到值

这个相当于是写map(更新或新增),第一个参数是key,第二个参数是value

通过提供一个键key,查找对应的值value,如果存在返回键的现有值,否则存储并返回给定的值,如果是读取则返回true,如果是存储返回false

通过提供一个键key,删除键对应的值

循环读取map中的值。

因为for … range map是内置的语言特性,所以没有办法使用for range遍历sync.Map, 但是可以使用它的Range方法,通过回调的方式遍历。

sync.Map应用

Go语言原子增(减)值------敬请期待!

第十一章 并发编程

第十二章 反射

第十三章 数据格式

第十四章 终端读取

第十五章 文件操作

第十六章 时间处理

第十七章 锁机制