go语言工具_Concurrent Map

文章探讨了在Go语言中如何实现并发安全的Map,比较了LockMap、RwLockMap、sync.Map和Concurrent Map的性能。通过基准测试发现,在读多写少的情况下,sync.Map性能最佳;而当写操作频繁时,Concurrent Map表现更优,因为它通过将大Map拆分为多个小Map并分配独立锁来减少锁冲突。
摘要由CSDN通过智能技术生成

Concurrent Map

背景

map是平时项目中经常用到的数据类型,但是如果多个协程去读写同一个map时,为了不发生数据错误,经常去将其和锁封装成一个新的map。像以下两种示例。

type LockMap struct {
    m    map[interface{}]interface{}
    lock sync.Mutex
}

 type RwLockMap struct {
    m    map[interface{}]interface{}
    lock sync.RWMutex
}

LockMap中,每次去读或者写时,都会调用Mutex去把map锁住。

RwLockMap中,如果程序中读较多,写较少的情况下,性能会比LockMap高很多,因为读的时候是可以多个协程一起读的。但是如果写较多时,性能可能与LockMap差不多。

这是我们不想看到的,我们想的是,随便读随便写,并且不会发生数据错误。go语言中有一个sync.Map.

sync.Map会有两块区域,一个是只读,一个是可读可写,其中可读可写的区域也是有一个锁的。每次操作时,会先去只读区域中寻找,只读区域未找到的时候触发miss,然后才会去可读可写区域寻找。很显然,最糟糕的情况下比LockMap性能更低,因为比LockMap多一次查找的动作。sync.Map也是适合读多写少的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值