一、map并发读写问题

如果map由多协程同时读和写就会出现 fatal error:concurrent map read and map write的错误

如下代码很容易就出现map并发读写问题

func main(){

c := make(map[string]int)
       go func() {//开一个协程写map
            for j := 0; j < 1000000; j++ {
              c[fmt.Sprintf("%d", j)] = j
            }
       }()
       go func() {    //开一个协程读map
             for j := 0; j < 1000000; j++ {
                 fmt.Println(c[fmt.Sprintf("%d",j)])
             }
       }()

time.Sleep(time.Second*20)

}

多个协程同时写也会出现fatal error: concurrent map writes的错误

如下代码很容易出现map并发写的问题

func main(){

c := make(map[string]int)

for i := 0; i < 100; i++ {
        go func() {  //开100个协程并发写map
              for j := 0; j < 1000000; j++ {
                     c[fmt.Sprintf("%d", j)] = j
              }
        }()
        }
       time.Sleep(time.Second*20)  //让执行main函数的主协成等待20s,不然不会执行上面的并发操作

}

二、出现问题的原因

因为map为引用类型,所以即使函数传值调用,参数副本依然指向映射m, 所以多个goroutine并发写同一个映射m, 写过多线程程序的同学都知道,对于共享变量,资源,并发读写会产生竞争的, 故共享资源遭到破坏

三、解决方法

1、加锁

(1)通用锁

type Demo struct {

Data map[string]string

Lock sync.Mutex

}

func (d Demo) Get(k string) string{

d.Lock.Lock()

defer d.Lock.UnLock()

return d.Data[k]

}

func (d Demo) Set(k,v string) {

d.Lock.Lock()

defer d.Lock.UnLock()

d.Data[k]=v

}

(2)读写锁

type Demo struct {

Data map[string]string

Lock sync.RwMutex

}

func (d Demo) Get(k string) string{

d.Lock.RLock()

defer d.Lock.RUnlock()

return d.Data[k]

}

func (d Demo) Set(k,v string) {

d.Lock.Lock()

defer d.Lock.UnLock()

d.Data[k]=v

}

2、利用channel串行化处理

golang中map并发读写问题及解决方法的更多相关文章

  1. 关于golang中某些包无法下载的解决方法

    由于某些不可描述的原因,我们 在go module 环境下(啥?这个不知道是啥?赶紧恶补下)进行go get xxxx时,会发现一些依赖库无法访问(不要问为什么无法访问). 解决办法 戳这里:http ...

  2. golang 中 map 转 struct

    golang 中 map 转 struct package main import ( "fmt" "github.com/goinggo/mapstructure&qu ...

  3. 【java 多线程】多线程并发同步问题及解决方法

    一.线程并发同步概念 线程同步其核心就在于一个“同”.所谓“同”就是协同.协助.配合,“同步”就是协同步调昨,也就是按照预定的先后顺序进行运行,即“你先,我等, 你做完,我再做”. 线程同步,就是当线 ...

  4. 编程中遇到的Python错误和解决方法汇总整理

    这篇文章主要介绍了自己编程中遇到的Python错误和解决方法汇总整理,本文收集整理了较多的案例,需要的朋友可以参考下   开个贴,用于记录平时经常碰到的Python的错误同时对导致错误的原因进行分析, ...

  5. sql server 还原数据库后,删除用户,提示数据库主体在该数据库中拥有架构,无法删除解决方法

    将另一台服务器上的数据库备份文件,在现在用的这台服务器上还原之后,再创建相同的用户名,提示用户已存在 想将之前的用户先删除掉,却提示“数据库主体在该数据库中拥有架构,无法删除解决方法” 在网上找到方法 ...

  6. jquery中checkbox全选失效的解决方法

    这篇文章主要介绍了jquery中checkbox全选失效的解决方法,需要的朋友可以参考下     如果你使用jQuery 1.6 ,代码if ( $(elem).attr(“checked”) ),将 ...

  7. ASP.NET Web Service中使用Session 及 Session丢失解决方法 续

    原文:ASP.NET Web Service中使用Session 及 Session丢失解决方法 续 1.关于Session丢失问题的说明汇总,参考这里 2.在Web Servcie中使用Sessio ...

  8. Linux中切换用户变成-bash4.1-$的解决方法【转】

    转自 Linux中切换用户变成-bash4.1-$的解决方法 - xia_xia的博客 - 博客频道 - CSDN.NEThttp://blog.csdn.net/xia_xia0919/articl ...

  9. Oracle 18c 数据库中scott用户不存在的解决方法

    Oracle 18c 数据库中scott用户不存在的解决方法 注:该文为转载 上面标题可直接跳转 原文地址:http://www.cnblogs.com/zangdalei/p/5482732.htm ...

随机推荐

  1. 在TFS 2013上,使用tf workspace命令删除其他用户的工作区

    8月25日补充:如果想批量删除工作区,你可以使用第三方工具MSBuild Sidekick http://www.attrice.info/downloads;或者自己编写一个bat脚本,但是缺陷是需 ...

  2. Kafka日志清除策略

    一.更改日志输出级别 config/log4j.properties中日志的级别设置的是TRACE,在长时间运行过程中产生的日志大小吓人,所以如果没有特殊需求,强烈建议将其更改成INFO级别.具体修改 ...

  3. razor----js

    <script> $(document).ready(function () { // 2  直接加引号转换 var SpecialAptitude = '@Model.SpecialAp ...

  4. RMAN - 发现I/O瓶颈

    大多数操作系统支持异步I/O. 备份到磁盘,异步I/O是一个优势,因为一个服务器进程同时可以执行多个I/O操作:同步I/O必须等上一个I/O操作完成才可以执行下一个I/O操作. 初始化参数disk_a ...

  5. Python radians() 函数

    描述 radians() 方法将角度转换为弧度. 语法 以下是 radians() 方法的语法: import math math.radians(x) 注意:radians()是不能直接访问的,需要 ...

  6. 使用BeanUtils设置属性转换String到Date类型

    主要是用来设置非空对象的属性. 1 使用BeanUtils进行设置属性时,对于String,int可以自动转换.比如下面的例子 常用方法 1)BeanUtils.setProperty    //// ...

  7. Vector3.Set的正确使用

    直接调用position.Set会发现没有用.其实和其本身是结构体有关,要当成一个值类型来看待,因为他全部是在栈中. transform.position.Set(,,); 改成这样即可: var t ...

  8. [docker]docker0网络模型探究

    docker0网络模型step by step 将docker的ns软链到linux ns $ ln -s /var/run/docker/netns /var/run/netns 查看ns,无 $ ...

  9. 【Android】12.3 在当前Activity中获取另一个Activity的返回值

    分类:C#.Android.VS2015: 创建日期:2016-02-23 一.简介 在上一节的示例中,通过StartActivity(Intent)方法启动另一个Activity后,这两个Activ ...

  10. 【Android】3.16 离线地图功能

    分类:C#.Android.VS2015.百度地图应用: 创建日期:2016-02-04 一.简介 百度地图目前已经支持矢量离线地图数据的下载.更新. 使用离线地图,可满足在无网络环境下查看地图信息的 ...