Lixv
@39427696
Golang实现并发安全的Map
Map 编程 go 并发编程
2022-11-13 14:10
Words count: 5715
最近在做一个用go实现redis的项目, 发现并发map是一个有意思的问题, 所以就写下一篇文章记录一下, 顺便分析一下官方的sync.Map源码, 并且写了一个比官方sync.Map性能更高的并发安全Map Map是一种数据结构,方便我们以O(1)的时间复杂度去根据...

最近在做一个用go实现redis的项目, 发现并发map是一个有意思的问题, 所以就写下一篇文章记录一下, 顺便分析一下官方的sync.Map源码, 并且写了一个比官方sync.Map性能更高的并发安全map

Map是一种数据结构,方便我们以O(1)的时间复杂度去根据key查找value,但golang底层的Map却是并发不安全的, 不安全的并发是什么意思?即当两个线程(协程)同时更改一个数据时会出现数据的竞争的问题.

先来看一段程序

package main
func main() {
    m := make(map[int]int)
    go func() {
        for {
            _ = m[1]
        }
    }()
    go func() {
        for {
            m[1] = 1
        }
    }()
    select {}
}
# 同时读写map
fatal error: concurrent map read and map write

可见go的原生map有并发读写的问题

这时候需要加锁去实现安全问题.可以加读写锁去更方便的去加数据. 比如

     type Map struct {
        rWMutex sync.RWMutex
        m       map[string]int
    }

    var m Map

    m.rWMutex.RLock()
    n := m.m["some_key"]
    m.rWMutex.RUnlock()
    fmt.Println("some_key:", n)

    m.rWMutex.Lock()
    m.m["some_key"]++
    m.rWMutex.Unlock()   
Arweave TX
dt693u1QFq7Q4gVfy3L6qHh-KM3YCs5dU4kq891oARU
Content Digest
a5fa016a596f469ad5815e04f7493c99923989232547809cf9b93046ef885b2b
- 90.0 % More to go -
Pay 0.000030 BTC (≈$1.8989) to continue reading
and receive early reader revenue (Rules)
This post is a virtural product selling on Quill, IT WILL NOT REFUND once paid. Please pay with caution.
Pay to Read
Already paid? Try to Login
1 : 0
3 times bought, 0 times reward
Comments
Lixv
@39427696
Subscribing: 12 Subscribers: 32
我本深渊
Subscribe
Related Posts
Defi乐高之借贷协议(2)--MarginFi 隐身3个月通关编程实战项目,升级进取型思维分享。 macOS系统多开Google Chrome浏览器 从小白到科学家(二)之脱胎换骨 Invoke the closed source contract tutorial with MetaMask
Rules Stats Help Github Twitter Discord
Lixv
@39427696
Subscribing: 12 Subscribers: 32
我本深渊
Subscribe
Related Posts
Defi乐高之借贷协议(2)--MarginFi 隐身3个月通关编程实战项目,升级进取型思维分享。 macOS系统多开Google Chrome浏览器 从小白到科学家(二)之脱胎换骨 Invoke the closed source contract tutorial with MetaMask
Rules Stats Help Github Twitter Discord