zoukankan      html  css  js  c++  java
  • golang map 读写锁与深度拷贝的坑

    0X01

    golang中,map(字典)无法并发读写

    简单来说,新建万条线程对同一个map又读又写,会报错。

    为此,最好加锁,其实性能影响并不明显。

    type taskCache struct{
        sync.RWMutex
        data map[string] interface{}
    }

    0X02

    golang中,map(字典)为引用拷贝。

    a = 字典一

    b = a 

    实际上是直接将指针传给了b。

    于是,有一个读取,写的时候直接读map并返回

    func GetAllTasks() (result map[string]interface{}, err error) {
        // 获得当前的所有任务
        DEMO.RLock()
        defer DEMO.RUnlock()
        return DEMO.data, err
    }

    而在线程中

    // 接收后直接打印
    fmt.Println(store.GetAllTasks())

    结果居然报错,map读写冲突。

    于是,我返回去一遍一遍看代码,觉得自己的读写锁写错了。

    调式折腾了半天,最后发现,在接收后不用 fmt.Println 打印就不会报错。

    这很不科学,然后在接收打印前后加上读锁,不报错了。

    0X03

    所以golang,加了读写锁的时候,要返回全部值,还不能直接返回这个字典,因为直接返回这个字典,返回了指针,操作的时候要不还要加读写锁,要不就报错。

    还没有直接的取地址的值重新给另一个变量的东西,自己写个遍历,一个一个赋值吧,蛋疼,坑货,坑了一晚上

    var cache = make(map[string]interface{})
    for k,v := range Demo.data{
        cache[k] = v
    }
  • 相关阅读:
    再回首Java第九天
    再回首Java第八天
    再回首Java一周记
    再回首Java第六天
    再回首Java第五天
    再回首Java第四天
    再回首Java第三天
    再回首Java第二天
    再回首Java第一天
    关于i++和++i理解
  • 原文地址:https://www.cnblogs.com/huim/p/10073837.html
Copyright © 2011-2022 走看看