教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 并发环境应用map的解决方案

并发环境应用map的解决方案

发布时间:2023-01-10   编辑:jiaochengji.com
教程集为您提供并发环境应用map的解决方案等资源,欢迎您收藏本站,我们将为您提供最新的并发环境应用map的解决方案资源

众所周知,golang的map是非协程安全的(go1.6版本以后,go1.6之前读安全),而并发读写map的需求应该是很普遍的。举例如下:

package main

import "fmt"

func main() {
    a := make(map[int]bool, 0)

    for i:=0;i<100;i  {
        go func() {
            for i := 0; i < 20000; i   {
                a[i] = false
                fmt.Printf("%v %v\n",i,a[i])
            }

        }()
    }
}

运行报错:
fatal error: concurrent map writes
1.9版本之前,官方提供的解决方案是自己封装个带同步锁的struct。例如:

package main

import (
    "fmt"
    "sync"

)

type SafeMap struct{
    sync.RWMutex
    data map[int]int
}

func main() {
    a := SafeMap{data: make(map[int]int)}
    for i:=0;i<100;i  {
        go func() {
            for j := 0; j < 20000; j   {
                a.Lock()
                a.data[j] = i
                fmt.Printf("%v %v\n", i, j)
                a.Unlock()
            }
        }()
    }
}

1.9版本以后,sync包引入了sync.Map,性能比起之前的解决方案有比较大的提升:

package main

    import (
        "fmt"
        "sync"
    )
    
    func main() {
        a := new(sync.Map)
        wg := new(sync.WaitGroup)
        wg.Add(100)
        for i:=0;i<100;i  {
            go func() {
                for j := 0; j < 100; j   {
                    a.Store(i, j)
                }
                wg.Done()
            }()
        }
        wg.Wait()
        a.Range(func(key, value interface{}) bool {
            fmt.Printf("%v %v\n", key, value)
    
            return true
        })
    }

到此这篇关于“并发环境应用map的解决方案”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
并发环境应用map的解决方案
如何在生产环境mysql删除亿万级数据解并且不影响数据库主从延迟的解决方案
Golang的map并发安全
Go range实现原理及性能优化剖析
java中使用Cookie替代Session解决跨域Session失效问题
Golang从入门到放弃200618--Map(1)Map的初始化和基本操作
golang for range原理(转载)
jsp开发入门(1)--安装配置jsp环境
java中并发环境下HashMap引起的full gc排查
golang中map的一些注意事项

[关闭]
~ ~