码迷,mamicode.com
首页 > 其他好文 > 详细

golang sync.map 源码粗略理解

时间:2020-06-04 21:55:47      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:技术   读取   表示   href   默认   ref   blog   try   删除   

golang 默认的map是线程不安全机制

sync.map 封装了锁的机制,实现了线程安全

其他人理解 https://www.cnblogs.com/zkqiang/p/12551611.html

技术图片

 

read 进行读取,dirty进行存储,其中数据类型实际都为 map[interface{}]*entry

技术图片

 

 含有三个方法

方法源码理解可以看上面的链接

 先说说store方法,k,v参数为interface{},使用

技术图片

 

 

先在read的map中寻找是否存在并未删除,存在说明不需要保存了

技术图片

 

 开启锁,防止来到这不之前其他协程操作产生变化,再次查询read map 如果存在(覆盖)dirty数据,read不存在第二步去dirty取值,查询都没有结果表示没有存储过,那么直接存储dirty中

 

load

技术图片

 

 read map中读取,如果不存在开启锁再次查询,如果还不存在去dirty中取值并在read map中设置等待下次取相同值直接返回

 

delete

技术图片

 

 查询read map 存在将 read map中 对象的属性 p=expunged 但不删除该数据 ,等待下次查询时如果拥有该数据 但p=expunged 则表示数据不存在技术图片

 

 read map 不存在,开启锁再次查询read map 去dirty删除数据

 

golang sync.map 源码粗略理解

标签:技术   读取   表示   href   默认   ref   blog   try   删除   

原文地址:https://www.cnblogs.com/zengxm/p/13046421.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!