golang map 多协程

本文探讨了Go语言中并发环境下map的使用,强调了多协程同时写入map会导致并发写异常,需加锁;同时写入读取时,写操作需加锁,读操作不加锁可能导致读取到脏数据;而在多协程只读取的情况下,加锁能保证数据的清洁,不加锁则存在脏数据风险。通过示例展示了1万协程读、写、无锁修改value的情况。
摘要由CSDN通过智能技术生成

golang中map的三个结论:多协程同时只写入,会发生 concurrent map write 异常,必须加锁
多协程同时写入读取,写入加锁,读取不加,不会异常,只是不确保读取的数据是否脏
多协程同时只读取,加锁数据干净,不加锁数据可能脏

package main

import (
    "fmt"
    "runtime"
    "sync"
)

func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())


    var m = make(map[string]*int,0)
    var l = & sync.RWMutex{}
    var a = 5
    m ["a"] = &a
    var wg = sync.WaitGroup{}
    for i:=0;i<10000;i++ {
        wg.Add(1)
        go func(wg *sync.WaitGroup, m *map[string]*int,l *sync.RWMutex) {
            defer wg.Done()

            writeM(m,l)
        }(&wg, &m, l)
    }
    for i:=0;i<10000;i++ {
        wg.Add(1)
        go func(wg *sync.WaitGroup, m *map[string]*int,l *sync.RWMutex) {
            defer wg.Done()

            readM(m,l)
        }(&wg, &m, l)
    }
    for i:=0;i<10000;i++ {
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值