zoukankan      html  css  js  c++  java
  • [Go] 解决go的fatal error: concurrent map writes map非并发安全

    map不是并发安全的 , 当有多个并发的groutine读写同一个map时 

    会出现panic错误

    concurrent map writes

    例如下面的代码会出现这个错误:

    var mMap map[int]int
    
    func TestMyMap(t *testing.T) {
        mMap = make(map[int]int)
    
        for i := 0; i < 5000; i++ {
            go func() {
                mMap[i] = i
            }()
            go readMap(i)
        }
    }
    func readMap(i int) int {
        return mMap[i]
    }

    解决这个错误可以有多种方式 , 现在采取读写锁的方式 ,

    并发访问map是不安全的,会出现未定义行为,导致程序退出。所以如果希望在多协程中并发访问map,必须提供某种同步机制,一般情况下通过读写锁sync.RWMutex实现对map的并发访问控制,将map和sync.RWMutex封装一下,可以实现对map的安全并发访问

    改造后的代码

    type SMap struct {
        sync.RWMutex
        Map map[int]int
    }
    
    func (l *SMap) readMap(key int) (int, bool) {
        l.RLock()
        value, ok := l.Map[key]
        l.RUnlock()
        return value, ok
    }
    
    func (l *SMap) writeMap(key int, value int) {
        l.Lock()
        l.Map[key] = value
        l.Unlock()
    }
    
    var mMap *SMap
    
    func TestMyMap(t *testing.T) {
        mMap = &SMap{
            Map: make(map[int]int),
        }
    
        for i := 0; i < 5000; i++ {
            go func() {
                mMap.writeMap(i, i)
            }()
            go readMap(i)
        }
    }
    func readMap(i int) (int, bool) {
        return mMap.readMap(i)
    }

     有这三种方式:

    1.使用channel
    2.使用sync.map
    3.使用map但必须进行加锁

    开源作品

    GO-FLY,一套可私有化部署的免费开源客服系统,安装过程不超过五分钟(超过你打我 !),基于Golang开发,二进制文件可直接使用无需搭开发环境,下载zip解压即可,仅依赖MySQL数据库,是一个开箱即用的网页在线客服系统,致力于帮助广大开发者/中小站长快速整合私有客服功能
    github地址:go-fly
    官网地址:https://gofly.sopans.com

    赞赏作者

    微信交流

  • 相关阅读:
    Activiti系列——如何在eclipse中安装 Activiti Designer插件
    C语言 二维数组与指针笔记
    Ubuntu linux设置从当前目录下加载动态库so文件
    Ubuntu14.04安装nfs服务器
    Ubuntu14.04 搭建FTP服务器
    Linux备忘命令
    Java实现对xml文件的增删改查
    Java利用jacob实现打印Excel文件
    git操作列表
    swiper 窗口宽度变化,页面宽度高度变化 导致自动滑动 解决方案
  • 原文地址:https://www.cnblogs.com/taoshihan/p/14717701.html
Copyright © 2011-2022 走看看