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

    赞赏作者

    微信交流

  • 相关阅读:
    android 使用广播监听网络状态
    Android获取文件目录路径
    android实现布局重叠
    文件存储到getfilesdir和getcache中的解析问题,原来是权限问题
    CodeForces 1047C Enlarge GCD(数论)题解
    html 空白汉字占位符&#12288;
    js 将json字符串转换为json兑现
    为什么jQuery要返回jQuery.fn.init对象
    transform和transition
    自适应网页设计/响应式Web设计
  • 原文地址:https://www.cnblogs.com/taoshihan/p/14717701.html
Copyright © 2011-2022 走看看