美文网首页
GO并发安全 Map

GO并发安全 Map

作者: peroLuo | 来源:发表于2020-02-28 15:16 被阅读0次

场景1:一个请求同时进行2条数据库查询操作,然后把查询的数据,传给一个map,然后返回给客户端

问题代码

func GetHome(c *gin.Context) {
    var wg sync.WaitGroup
    res := make(map[string]interface{})
    var g modle.Goods
    wg.Add(2)
    // 数据库查询1
    go func() {
        goods, _ := g.NewGoods(1, 5)
        res["good"] = goods
        wg.Done()
    }()
    // 数据库查询2
    go func() {
        good, _ := g.Search()
        res["goods"] = good
        wg.Done()
    }()
    wg.Wait()
    response.ReSuccess(c, "", res)
}

进行多次访问后,会出现fatal error: concurrent map writes错误。
结论: Map数据写入操作线程不安全

解决方案一 Channel

func GetHome(c *gin.Context) {
    var c1 = make(chan modle.Goods, 1)
    var c2 = make(chan []modle.Goods, 1)
    res := make(map[string]interface{})
    var g modle.Goods
    // 数据库查询1
    go func() {
        goods, _ := g.NewGoods(1, 5)
        c2 <- goods
    }()
    // 数据库查询2
    go func() {
        good, _ := g.Search()
        c1 <- good
    }()
    res["good"] = <-c1
    res["goods"] = <-c2
    response.ReSuccess(c, "", res)
}

解决方案2 sync.Map

func GetHome(c *gin.Context) {
    var wg sync.WaitGroup
    var m = sync.Map{}
    var g modle.Goods
    res := make(map[string]interface{})
    wg.Add(2)
    // 数据库查询1
    go func() {
        goods, _ := g.NewGoods(1, 5)
        m.Store("goods", goods)
        wg.Done()
    }()
    // 数据库查询2
    go func() {
        good, _ := g.Search()
        m.Store("good", good)
        wg.Done()
    }()
    wg.Wait()
    good, _ := m.Load("good")
    goods, _ := m.Load("goods")
    res["good"] = good
    res["good"] = goods
    response.ReSuccess(c, "", res)
}

相关文章

  • Go语言高并发Map解决方案

    Go语言高并发Map解决方案 Go语言基础库中的map不是并发安全的,不过基于读写锁可以实现线程安全;不过在Go1...

  • Go Map 为什么是非线程安全的?

    Go map 默认是并发不安全的,同时对 map 进行并发读写的时,程序会 panic,原因如下:Go 官方经过长...

  • 详尽解析go中的fatal error: concurrent

    fatal error: concurrent map writes 问题出现的原因 go中的map不是并发安全的...

  • GO并发安全 Map

    场景1:一个请求同时进行2条数据库查询操作,然后把查询的数据,传给一个map,然后返回给客户端 问题代码 进行多次...

  • map与sync.Map

    Go 语言原生 map 并不是线程安全的,对它进行并发读写操作的时候,需要加锁。而 sync.map 则是一种并发...

  • Go语言——sync.Map详解

    Go语言——sync.Map详解 sync.Map是1.9才推荐的并发安全的map,除了互斥量以外,还运用了原子操...

  • golang并发map记录

    1.普通map+mutex,实现map的并发安全读写 2.sync.Map 3.第三方并发安全map库

  • Go sync.Map

    map并发读线程安全,并发读写线程不安全。 sync.Map 读写分离 空间换时间 Map Golang1.6之前...

  • map.go

    原生的map go中原生的map不是线程安全的,并发情况下会报错,如下 并发读和写就会报上面的问题,哪怕是多读一写...

  • go map的线程安全使用

    go map的线程安全使用 简单线程安全使用 在很多时候,我们会并发地使用map对象,尤其是在一定规模的项目中,m...

网友评论

      本文标题:GO并发安全 Map

      本文链接:https://www.haomeiwen.com/subject/qcllhhtx.html