因为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,就可以不用考虑同时读写的问题了。

最新文章

  1. 由position属性引申的关于css的进阶讨论(包含块、BFC、margin collapse)
  2. asp.net页面生命周期的文章推荐
  3. throttle在程序中的作用
  4. .Net 内存溢出(System.OutOfMemoryException)的常见情况和处理方式总结
  5. Java 提示 JRE unbound 或者 Tomcat unbound 解决方法
  6. struts2下实现的json传递list,object。
  7. Delphi遍历文件夹
  8. core--进程
  9. Linux服务器下没有root权限装Matlab R2013a
  10. Spark SQL概念学习系列之Spark生态之Spark SQL(七)
  11. 华为荣耀6PLUS 秒杀苹果
  12. 改ucosii的中断禁止和恢复代码,这是一个荒谬的错误【 mrs msr】
  13. Cache替换算法:LRU与LFU的区别
  14. Mybatis,Spring,SpringMVC框架面试题
  15. spark-shell 显示乱码
  16. Hive 报错:java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient
  17. python 爬取百度翻译进行中英互译
  18. Cocos2D v2.0至v3.x简洁转换指南(五)
  19. JAVA进阶9
  20. Python: datetime 转换

热门文章

  1. ABAP中SPLIT关键字 当分隔符位于字符串首尾时
  2. Spring Schema扩展机制
  3. java集合框架collection(6)继承结构图
  4. vux loadmore + axios 实现点击加载更多
  5. leadcode的Hot100系列--206. 反转链表
  6. POJ 1485:Fast Food(dp)&& 面试题
  7. POJ 2449:Remmarguts' Date(A* + SPFA)
  8. MySQL编译安装及启动
  9. 哈工大计算机网络Week0-概述
  10. Object.keys使用整理