Go错误集锦 -- Map引起的崩溃concurrent map iteration and map write-程序员宅基地

技术标签: golang  Go  go  map  

    今天早上一来领导告诉我消息源出问题了,赶紧检查日志,没有报错,于是跟着看nohup输出,看到一个error导致了程序崩溃,fatal error: concurrent map iteration and map write.

    看到这个错误信息,很容易就想到了,可能是在多线程中,同时对map进行了遍历和写操作,导致的崩溃。然后通过对代码进行检查,发现了确实有一处地方,没有对遍历map的操作加锁,导致了这个问题。之前只考虑到了读和写会引发崩溃,直到今天发生崩溃了才发现这个问题。

    上一下之前的模拟代码:

func MapMuxTest() {
    mMap := make(map[int]string)
    var mux sync.RWMutex
    mMap[1] = "new rap"
    mMap[2] = "new star"
    mMap[3] = "mo"
    mMap[4] = "dong"
    mMap[5] = "shan"
    mMap[6] = "ba"

    go func(mux *sync.RWMutex, mMap map[int]string) {
        ti := time.NewTimer(time.Nanosecond * 2)
        idx := 1
        for {
            <- ti.C

            mux.Lock()
            mMap[idx] = "mdsb"        // map write
            idx++
            if idx >= 7 {
                idx = 1
            }
            mux.Unlock()

            ti.Reset(time.Nanosecond * 2)
        }
    }(&mux, mMap)

    ti := time.NewTimer(time.Millisecond)
    for {
        <- ti.C

        // 这里没有对遍历操作加锁,导致和上面的写操作冲突
        for k, _ := range mMap {    // map iteration
            mux.RLock()
            str := mMap[k]
            fmt.Println(str)
            mux.RUnlock()
        }

        ti.Reset(time.Millisecond)
    }
}

    之后,把代码修改了一下,就是把加锁解锁的操作放在了遍历的外面,避免了遍历map和写map的冲突。

mux.RLock()
for k, _ := range mMap {
    str := mMap[k]
    fmt.Println(str)
}
mux.RUnlock()

    本篇到此结束,简单记录一下这个问题。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhounixing/article/details/107334087

智能推荐

springaop无法拦截service方法中调用_aop 不能拦截service-程序员宅基地

文章浏览阅读1k次。问题描述:springaop无法拦截service方法中调用,在service类中方法A调用带有切面注解的方法B,切面失效问题分析:AOP底层实现: 拦截器的实现原理就是动态代理,实现AOP机制。Spring 的代理实现有两种:一是基于 JDK Dynamic Proxy 技术而实现的;二是基于 CGLIB 技术而实现的。如果目标对象实现了接口,在默认情况下Spring会采用JDK的动态代理实现AOP; ***总之是类(接口类)级别的代理***;解决思路: 只要将方法A调用方法B过程中添加_aop 不能拦截service

Java实现二维码批量生成_java批量生成二维码-程序员宅基地

文章浏览阅读645次。Java批量生成二维码实例_java批量生成二维码

CentOS8 安装数据库_centos8 安装vastbase数据库-程序员宅基地

文章浏览阅读961次。yum -y localinstall mysql80-community-release-el7-1.noarch.rpmpip3.6 install mycli_centos8 安装vastbase数据库

子类继承父类时各种属性的问题_一个子类继承另一个父类然后子类new对象属性分装不进去-程序员宅基地

文章浏览阅读2.2k次。普通属性子类可以继承父类的属性值,后续操作互不影响。静态属性:public class Main7 extends Father{ //static int test = 11; public static void main(String[] args) { test++; Father father = new Father(); System.out.printl..._一个子类继承另一个父类然后子类new对象属性分装不进去

摄像机内参与OpenGL_摄像机四个内参-程序员宅基地

文章浏览阅读2.4k次,点赞4次,收藏14次。参考转自:https://blog.csdn.net/yanglusheng/article/details/52268234https://blog.csdn.net/sunboyiris/article/details/780826991、 相机参数是三种不同的参数。相机的内参数是六个分别为:1/dx、1/dy、r、u0、v0、f。opencv1里的说内参数是4个其为fx、..._摄像机四个内参

随便推点

Day507.Linux下MySQL的安装与使用 -mysql-程序员宅基地

文章浏览阅读1.6k次,点赞6次,收藏12次。Linux下MySQL的安装与使用一、安装前说明1、Linux系统及工具的准备安装并启动好两台虚拟机: CentOS 7掌握克隆虚拟机的操作mac地址主机名ip地址UUID安装有 Xshell 和 Xftp 等访问CentOS系统的工具CentOS6和CentOS7在MySQL的使用中的区别防火墙:6是iptables,7是firewalld启动服务的命令:6是service,7是systemctl2、查看是否安装过MySQL如果你是用rpm安装, 检

python3 [爬虫实战] 微博爬虫京东客服之Selenium + Chrom浏览器的使用(上)_京东爬虫 对浏览器的要求-程序员宅基地

文章浏览阅读1k次。先暂时记录一下首先 Chrom浏览器一定要匹配好, 不能在百度搜索中下载最新的谷歌浏览器,我现在下的是版本50的浏览器。匹配的chromedriver.exe 是2.9的。32位的同样也使用64位的。 需要把chromedriver.exe 安装在谷歌浏览器的安装目录下,路径是:C:\Program Files (x86)\Google\Chrome\Application与chrome.ex_京东爬虫 对浏览器的要求

[转]十个完全免费的网页原型(线框图)工具_将网站直接转换成原型图-程序员宅基地

文章浏览阅读890次。网页的线框图是非常直观、但是也没什么技术上难点的东西。只需要你大概描出页面上需要的一些元素,比如头部、导航、页脚等等,最多再就是一些交互、内容区域什么的。但这对于任何网络应用的开发都是非常重要的。当然有很多种方法可以做这件事情,最简单的就是拿起纸和笔,但是在这篇文章中,我们要介绍的是一些非常高效好用的在线原型工具,并且他们完全免费。Lumzy 快速原型工具使用Lumzy你可以为你的应用创建_将网站直接转换成原型图

深度学习中关于样本不均衡问题的解决_深度学习重采样-程序员宅基地

文章浏览阅读1k次。深度学习中的样本不均衡问题_深度学习重采样

基于keras采用LSTM实现多标签文本分类(一)_keras lstm多分类-程序员宅基地

文章浏览阅读2.5k次。1.多标签即一条语句可能有多个类别划分。例如,这个酸菜鱼又酸又辣。属于酸和辣两个标签。在采用神经网络学习时,最后一层的激活函数应采用sigmoid激活函数,相当于对这条语句做了多个二分类。2.多分类即每条语句只有一个标签,在采用神经网络学习时,最后一层的激活函数应采用softmax激活函数,最后选取类别中的最大值作为预测结果。关于sigmoid和softmax 的区别此处再说明。本次数据集的格式为:关于LSTM的学习可以参考这篇。关于词向量化的方式,本文采用keras 内置Tokenizer A_keras lstm多分类

常用抓包工具分析_包分析工具-程序员宅基地

文章浏览阅读2.5w次,点赞3次,收藏38次。常用的抓包工具有: tcpdump (linux) wireshark (windows) tcpflow (linux) httpwatch (windows) 浏览器自带抓包工具 (windows)tcpdump (linux)tcpdump是linux下的抓包工具,一般使用比较习惯于,在linux下用tcpdump抓包,结果存入文件,把文件导入windows下用window..._包分析工具

推荐文章

热门文章

相关标签