concurrent map read and map write

记录一次项目中,map因多线程冲突占用的问题

type TestMap struct {
    data map[int]int
}
func (m *TestMap) writeMap(k, v int) {
    if m.data == nil {
        m.data = make(map[int]int)
    }
    m.data[k] = v
}
func run() {
    m := &TestMap{}
    for i := 0; i < 1000; i++ {
        go m.writeMap(i, i)
    }
}

只是打一个比方,方法差不多

这样会导致map在一个线程中写入中,另一个线程也在写入

这时需要加锁

type TestMap struct {
    data map[int]int
    Mu   sync.Mutex        // 加入锁
}
func (m *TestMap) writeMap(k, v int) {
    m.Mu.Lock()            // 使用锁先锁定
    defer m.Mu.Unlock()    // 等方法执行完解除锁
    if m.data == nil {
        m.data = make(map[int]int)
    }
    m.data[k] = v
}

 

posted @ 2023-02-20 16:37  张永峰z  阅读(98)  评论(0编辑  收藏  举报