V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
SGL
V2EX  ›  Go 编程语言

go 最新版的 map 并发读是安全的吗。

  •  
  •   SGL · 9 小时 45 分钟前 · 1829 次点击
    只读不写,写的时候加锁,读的时候并发,这个安全吗。
    15 条回复    2025-10-23 18:33:52 +08:00
    SGL
        1
    SGL  
    OP
       9 小时 43 分钟前
    Maps are not safe for concurrent use: it’s not defined what happens when you read and write to them simultaneously. If you need to read from and write to a map from concurrently executing goroutines, the accesses must be mediated by some kind of synchronization mechanism. One common way to protect maps is with sync.RWMutex.
    映射结构不适用于并发场景:当同时进行读写操作时,其行为是未定义的。若需要在并发执行的 goroutine 中对映射进行读写操作,必须通过某种同步机制来协调访问。保护映射的常用方式之一是使用 sync.RWMutex 。

    This statement declares a counter variable that is an anonymous struct containing a map and an embedded sync.RWMutex.
    该语句声明了一个 counter 变量,这是一个包含映射和嵌入式 sync.RWMutex 的匿名结构体。

    var counter = struct{
    sync.RWMutex
    m map[string]int
    }{m: make(map[string]int)}
    To read from the counter, take the read lock:
    读取计数器时需获取读锁:

    counter.RLock()
    n := counter.m["some_key"]
    counter.RUnlock()
    fmt.Println("some_key:", n)
    To write to the counter, take the write lock:
    写入计数器时需获取写锁:

    counter.Lock()
    counter.m["some_key"]++
    counter.Unlock()

    来源: https://go.dev/blog/maps?utm_source=chatgpt.com
    kfpenn
        2
    kfpenn  
       9 小时 23 分钟前
    并发读是安全的,但如果你读不加锁,不能保证读的时候没有写,如果读的时候遇到了写,就会 panic
    xdeng
        3
    xdeng  
       9 小时 8 分钟前
    标准库封装了个 sync.Map
    Nanosk
        4
    Nanosk  
       9 小时 6 分钟前   ❤️ 1
    你发这个是旧的 map 吧,如果是 2 楼说的基本没问题,只有一点不太正确,并发读写并不是 panic ,而是 fatal
    新的 SwissMap 没看过源码 不了解。
    git00ll
        5
    git00ll  
       8 小时 40 分钟前
    要用读写锁吧,不然可能读到不一致的数据
    me262
        6
    me262  
       8 小时 7 分钟前   ❤️ 1
    https://go.dev/blog/swisstable
    别乱发啊 2 楼,最新都是 swiss table
    ripperdev
        7
    ripperdev  
       8 小时 7 分钟前
    sync.Map 针对读多写少有优化,直接用就好了
    oom
        8
    oom  
       4 小时 28 分钟前
    不安全,读多写少加读写锁,或者使用原子 sync.Map ,但是取值相对麻烦
    kfpenn
        9
    kfpenn  
       4 小时 11 分钟前
    @me262 所以呢?这个说明也没说最新的 map 支持并发啊
    aladdinding
        10
    aladdinding  
       3 小时 44 分钟前
    我一般都是并发读,指针替换更新整个 map
    ca2oh4
        11
    ca2oh4  
       2 小时 13 分钟前
    sync.Map 太抽象了,连个类型都不给
    ca2oh4
        12
    ca2oh4  
       2 小时 13 分钟前
    @ripperdev sync.Map 太抽象了,连个类型都不给
    charlie21
        13
    charlie21  
       2 小时 3 分钟前 via Android
    有意思
    ripperdev
        14
    ripperdev  
       1 小时 19 分钟前
    @ca2oh4 #12 什么意思?是指 Key 和 Value 都是 any 类型?
    xxx88xxx
        15
    xxx88xxx  
       1 小时 2 分钟前 via Android
    我今天问了 GPT 类似的问题,GPT 告诉我最最优的方法是:并发前,将 map 深度拷贝后在使用
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   3110 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 11:36 · PVG 19:36 · LAX 04:36 · JFK 07:36
    ♥ Do have faith in what you're doing.