Go语言中的map在并发情况下,只读线程是安全的,但是同时读写线程是不安全的
1.png

一般做法,加锁,但是太繁琐、性能又不高。在GO语言中提供了一种效率较高的并发安全的sync.Map,sync.Map和map不同,是在sync包下的。
sync.Map有以下特性
• 读写分离,通过read只读和dirty写map将操作分离,通过原子指令对read map来进行读操作不需要加锁了,从而提高读的性能
• 延迟提升策略,进行批量将当前map中的所有元素都提升到read只读map中从而为后续的读访问提供无锁支持
• 指针结合惰性删除的方式进行map的value的储存
Load
加载方法,读操作,提供一个key,查找对应的value
2.png

首先从m.read中加载,不存在,并m.dirty中有新数据,加锁,从m.dirty中加载使用了双重检查处理
Store
更新或者新增一个键值对
3.png

Delete
删除一个键值对
4.png

从m.dirty中直接删除即可,就当它没存在过,但是如果是从m.read中删除,并不会直接删除,而是打标记
Range
sync.Map不能使用for range遍历sync.Map提供Range方法,通过回调方式遍历
5.png

Last modification:April 17th, 2020 at 03:59 pm
如果觉得我的文章对你有用,请随意赞赏