golang在多个go routine中进行map或者slice操作应该注意的对象。
2024-10-02 06:33:30
因为golang的map和列表切片都是引用类型,且非线程安全的,所以在多个go routine中进行读写操作的时候,会产生“map read and map write“的panic错误。
某一些类型的对象,会有这种类似的set方法来写数据,或者get方法来返回一个map:
func (this *object) Set(name, val) {
this.Lock()
defer this.Unlock()
this.m[name] = val
} func (this *object) Get() map[string]string {
this.Lock()
defer this.Unlock() return this.m
}
如果会在多个go routine中通过该对象的Get()方法获取到的map进行读操作,并且在其他go routine中用Set()方法来写操作,那么有可能会导致“map read and map write“的panic错误。
原因是Get方法获取的map和Set方法操作的map是同一个map,如果读写线程在同一时刻操作这2个map,就会产生错误。
所以Get方法最好用这种方式返回map:
func (this *object) Get() map[string]string {
this.Lock()
defer this.Unlock() newm := make(map[string]string)
for k, v := range this.m {
newm[k] = v
} return newm
}
这样每次Get获取的map,其实是一个新的map,就可以不用考虑同时读写的问题了。
最新文章
- 由position属性引申的关于css的进阶讨论(包含块、BFC、margin collapse)
- asp.net页面生命周期的文章推荐
- throttle在程序中的作用
- .Net 内存溢出(System.OutOfMemoryException)的常见情况和处理方式总结
- Java 提示 JRE unbound 或者 Tomcat unbound 解决方法
- struts2下实现的json传递list,object。
- Delphi遍历文件夹
- core--进程
- Linux服务器下没有root权限装Matlab R2013a
- Spark SQL概念学习系列之Spark生态之Spark SQL(七)
- 华为荣耀6PLUS 秒杀苹果
- 改ucosii的中断禁止和恢复代码,这是一个荒谬的错误【 mrs msr】
- Cache替换算法:LRU与LFU的区别
- Mybatis,Spring,SpringMVC框架面试题
- spark-shell 显示乱码
- Hive 报错:java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient
- python 爬取百度翻译进行中英互译
- Cocos2D v2.0至v3.x简洁转换指南(五)
- JAVA进阶9
- Python: datetime 转换
热门文章
- ABAP中SPLIT关键字 当分隔符位于字符串首尾时
- Spring Schema扩展机制
- java集合框架collection(6)继承结构图
- vux loadmore + axios 实现点击加载更多
- leadcode的Hot100系列--206. 反转链表
- POJ 1485:Fast Food(dp)&;&; 面试题
- POJ 2449:Remmarguts' Date(A* + SPFA)
- MySQL编译安装及启动
- 哈工大计算机网络Week0-概述
- Object.keys使用整理