How to recover from concurrent map writes?

后端 未结 2 614
闹比i
闹比i 2020-12-06 14:45

How do you recover from a runtime panic on a \"concurrent map read and map write\"? The usual defer with recover doesn\'t seem to work. Why is that?

I know that you

2条回答
  •  刺人心
    刺人心 (楼主)
    2020-12-06 15:13

    Do not recover, guard your code with mutexes form package sync.

    package main
    
    import (
        "sync"
        "time"
    )
    
    var m = make(map[string]string)
    var l = sync.Mutex{}
    
    func main() {
        go func() {
            for {
                l.Lock()
                m["x"] = "foo"
                l.Unlock()
            }
        }()
        go func() {
            for {
                l.Lock()
                m["x"] = "foo"
                l.Unlock()
            }
        }()
    
        time.Sleep(1 * time.Second)
    }
    

提交回复
热议问题